k1x:add k1x-soc rtc driver and clk&reset interface

Change-Id: I751ec10994c8c671fcd27594be70bb1f2d5a99dc
This commit is contained in:
yanhaodong
2023-12-26 11:01:22 +08:00
committed by zhangmeng
parent 326dca2524
commit 2b6e24ff29
4 changed files with 22 additions and 1 deletions

View File

@@ -353,6 +353,8 @@ CONFIG_MMC=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_SDHCI_OF_K1X=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_SA1100=y
CONFIG_DMADEVICES=y
CONFIG_MMP_PDMA_DRIVER=y
CONFIG_MMP_PDMA_SPACEMIT_K1X=y

View File

@@ -1432,7 +1432,7 @@ config RTC_DRV_EP93XX
config RTC_DRV_SA1100
tristate "SA11x0/PXA2xx/PXA910"
depends on ARCH_SA1100 || ARCH_PXA || ARCH_MMP
depends on ARCH_SA1100 || ARCH_PXA || ARCH_MMP || SOC_SPACEMIT_K1X
help
If you say Y here you will get access to the real time clock
built into your SA11x0 or PXA2xx CPU.

View File

@@ -20,6 +20,7 @@
#include <linux/platform_device.h>
#include <linux/module.h>
#include <linux/clk.h>
#include <linux/reset.h>
#include <linux/rtc.h>
#include <linux/init.h>
#include <linux/fs.h>
@@ -80,7 +81,10 @@ static irqreturn_t sa1100_rtc_interrupt(int irq, void *dev_id)
/* update irq data & counter */
if (rtsr & RTSR_AL)
{
events |= RTC_AF | RTC_IRQF;
printk("rtc hit alarm\n");
}
if (rtsr & RTSR_HZ)
events |= RTC_UF | RTC_IRQF;
@@ -186,6 +190,10 @@ int sa1100_rtc_init(struct platform_device *pdev, struct sa1100_rtc *info)
ret = clk_prepare_enable(info->clk);
if (ret)
return ret;
ret = reset_control_deassert(info->reset);
if(ret)
goto free_clk;
/*
* According to the manual we should be able to let RTTR be zero
* and then a default diviser for a 32.768KHz clock is used.
@@ -207,6 +215,7 @@ int sa1100_rtc_init(struct platform_device *pdev, struct sa1100_rtc *info)
ret = devm_rtc_register_device(info->rtc);
if (ret) {
reset_control_assert(info->reset);
clk_disable_unprepare(info->clk);
return ret;
}
@@ -236,6 +245,10 @@ int sa1100_rtc_init(struct platform_device *pdev, struct sa1100_rtc *info)
writel_relaxed(RTSR_AL | RTSR_HZ, info->rtsr);
return 0;
free_clk:
clk_disable_unprepare(info->clk);
return ret;
}
EXPORT_SYMBOL_GPL(sa1100_rtc_init);
@@ -274,6 +287,10 @@ static int sa1100_rtc_probe(struct platform_device *pdev)
return ret;
}
info->reset = devm_reset_control_get_optional(&pdev->dev, NULL);
if(IS_ERR(info->reset))
return PTR_ERR(info->reset);
base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(base))
return PTR_ERR(base);
@@ -305,6 +322,7 @@ static void sa1100_rtc_remove(struct platform_device *pdev)
spin_lock_irq(&info->lock);
writel_relaxed(0, info->rtsr);
spin_unlock_irq(&info->lock);
reset_control_assert(info->reset);
clk_disable_unprepare(info->clk);
}
}

View File

@@ -17,6 +17,7 @@ struct sa1100_rtc {
int irq_alarm;
struct rtc_device *rtc;
struct clk *clk;
struct reset_control *reset;
};
int sa1100_rtc_init(struct platform_device *pdev, struct sa1100_rtc *info);