cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rtc-mt7622.c (10034B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Driver for MediaTek SoC based RTC
      4 *
      5 * Copyright (C) 2017 Sean Wang <sean.wang@mediatek.com>
      6 */
      7
      8#include <linux/clk.h>
      9#include <linux/interrupt.h>
     10#include <linux/module.h>
     11#include <linux/of_address.h>
     12#include <linux/of_device.h>
     13#include <linux/platform_device.h>
     14#include <linux/rtc.h>
     15
     16#define MTK_RTC_DEV KBUILD_MODNAME
     17
     18#define MTK_RTC_PWRCHK1		0x4
     19#define	RTC_PWRCHK1_MAGIC	0xc6
     20
     21#define MTK_RTC_PWRCHK2		0x8
     22#define	RTC_PWRCHK2_MAGIC	0x9a
     23
     24#define MTK_RTC_KEY		0xc
     25#define	RTC_KEY_MAGIC		0x59
     26
     27#define MTK_RTC_PROT1		0x10
     28#define	RTC_PROT1_MAGIC		0xa3
     29
     30#define MTK_RTC_PROT2		0x14
     31#define	RTC_PROT2_MAGIC		0x57
     32
     33#define MTK_RTC_PROT3		0x18
     34#define	RTC_PROT3_MAGIC		0x67
     35
     36#define MTK_RTC_PROT4		0x1c
     37#define	RTC_PROT4_MAGIC		0xd2
     38
     39#define MTK_RTC_CTL		0x20
     40#define	RTC_RC_STOP		BIT(0)
     41
     42#define MTK_RTC_DEBNCE		0x2c
     43#define	RTC_DEBNCE_MASK		GENMASK(2, 0)
     44
     45#define MTK_RTC_INT		0x30
     46#define RTC_INT_AL_STA		BIT(4)
     47
     48/*
     49 * Ranges from 0x40 to 0x78 provide RTC time setup for year, month,
     50 * day of month, day of week, hour, minute and second.
     51 */
     52#define MTK_RTC_TREG(_t, _f)	(0x40 + (0x4 * (_f)) + ((_t) * 0x20))
     53
     54#define MTK_RTC_AL_CTL		0x7c
     55#define	RTC_AL_EN		BIT(0)
     56#define	RTC_AL_ALL		GENMASK(7, 0)
     57
     58/*
     59 * The offset is used in the translation for the year between in struct
     60 * rtc_time and in hardware register MTK_RTC_TREG(x,MTK_YEA)
     61 */
     62#define MTK_RTC_TM_YR_OFFSET	100
     63
     64/*
     65 * The lowest value for the valid tm_year. RTC hardware would take incorrectly
     66 * tm_year 100 as not a leap year and thus it is also required being excluded
     67 * from the valid options.
     68 */
     69#define MTK_RTC_TM_YR_L		(MTK_RTC_TM_YR_OFFSET + 1)
     70
     71/*
     72 * The most year the RTC can hold is 99 and the next to 99 in year register
     73 * would be wraparound to 0, for MT7622.
     74 */
     75#define MTK_RTC_HW_YR_LIMIT	99
     76
     77/* The highest value for the valid tm_year */
     78#define MTK_RTC_TM_YR_H		(MTK_RTC_TM_YR_OFFSET + MTK_RTC_HW_YR_LIMIT)
     79
     80/* Simple macro helps to check whether the hardware supports the tm_year */
     81#define MTK_RTC_TM_YR_VALID(_y)	((_y) >= MTK_RTC_TM_YR_L && \
     82				 (_y) <= MTK_RTC_TM_YR_H)
     83
     84/* Types of the function the RTC provides are time counter and alarm. */
     85enum {
     86	MTK_TC,
     87	MTK_AL,
     88};
     89
     90/* Indexes are used for the pointer to relevant registers in MTK_RTC_TREG */
     91enum {
     92	MTK_YEA,
     93	MTK_MON,
     94	MTK_DOM,
     95	MTK_DOW,
     96	MTK_HOU,
     97	MTK_MIN,
     98	MTK_SEC
     99};
    100
    101struct mtk_rtc {
    102	struct rtc_device *rtc;
    103	void __iomem *base;
    104	int irq;
    105	struct clk *clk;
    106};
    107
    108static void mtk_w32(struct mtk_rtc *rtc, u32 reg, u32 val)
    109{
    110	writel_relaxed(val, rtc->base + reg);
    111}
    112
    113static u32 mtk_r32(struct mtk_rtc *rtc, u32 reg)
    114{
    115	return readl_relaxed(rtc->base + reg);
    116}
    117
    118static void mtk_rmw(struct mtk_rtc *rtc, u32 reg, u32 mask, u32 set)
    119{
    120	u32 val;
    121
    122	val = mtk_r32(rtc, reg);
    123	val &= ~mask;
    124	val |= set;
    125	mtk_w32(rtc, reg, val);
    126}
    127
    128static void mtk_set(struct mtk_rtc *rtc, u32 reg, u32 val)
    129{
    130	mtk_rmw(rtc, reg, 0, val);
    131}
    132
    133static void mtk_clr(struct mtk_rtc *rtc, u32 reg, u32 val)
    134{
    135	mtk_rmw(rtc, reg, val, 0);
    136}
    137
    138static void mtk_rtc_hw_init(struct mtk_rtc *hw)
    139{
    140	/* The setup of the init sequence is for allowing RTC got to work */
    141	mtk_w32(hw, MTK_RTC_PWRCHK1, RTC_PWRCHK1_MAGIC);
    142	mtk_w32(hw, MTK_RTC_PWRCHK2, RTC_PWRCHK2_MAGIC);
    143	mtk_w32(hw, MTK_RTC_KEY, RTC_KEY_MAGIC);
    144	mtk_w32(hw, MTK_RTC_PROT1, RTC_PROT1_MAGIC);
    145	mtk_w32(hw, MTK_RTC_PROT2, RTC_PROT2_MAGIC);
    146	mtk_w32(hw, MTK_RTC_PROT3, RTC_PROT3_MAGIC);
    147	mtk_w32(hw, MTK_RTC_PROT4, RTC_PROT4_MAGIC);
    148	mtk_rmw(hw, MTK_RTC_DEBNCE, RTC_DEBNCE_MASK, 0);
    149	mtk_clr(hw, MTK_RTC_CTL, RTC_RC_STOP);
    150}
    151
    152static void mtk_rtc_get_alarm_or_time(struct mtk_rtc *hw, struct rtc_time *tm,
    153				      int time_alarm)
    154{
    155	u32 year, mon, mday, wday, hour, min, sec;
    156
    157	/*
    158	 * Read again until the field of the second is not changed which
    159	 * ensures all fields in the consistent state. Note that MTK_SEC must
    160	 * be read first. In this way, it guarantees the others remain not
    161	 * changed when the results for two MTK_SEC consecutive reads are same.
    162	 */
    163	do {
    164		sec = mtk_r32(hw, MTK_RTC_TREG(time_alarm, MTK_SEC));
    165		min = mtk_r32(hw, MTK_RTC_TREG(time_alarm, MTK_MIN));
    166		hour = mtk_r32(hw, MTK_RTC_TREG(time_alarm, MTK_HOU));
    167		wday = mtk_r32(hw, MTK_RTC_TREG(time_alarm, MTK_DOW));
    168		mday = mtk_r32(hw, MTK_RTC_TREG(time_alarm, MTK_DOM));
    169		mon = mtk_r32(hw, MTK_RTC_TREG(time_alarm, MTK_MON));
    170		year = mtk_r32(hw, MTK_RTC_TREG(time_alarm, MTK_YEA));
    171	} while (sec != mtk_r32(hw, MTK_RTC_TREG(time_alarm, MTK_SEC)));
    172
    173	tm->tm_sec  = sec;
    174	tm->tm_min  = min;
    175	tm->tm_hour = hour;
    176	tm->tm_wday = wday;
    177	tm->tm_mday = mday;
    178	tm->tm_mon  = mon - 1;
    179
    180	/* Rebase to the absolute year which userspace queries */
    181	tm->tm_year = year + MTK_RTC_TM_YR_OFFSET;
    182}
    183
    184static void mtk_rtc_set_alarm_or_time(struct mtk_rtc *hw, struct rtc_time *tm,
    185				      int time_alarm)
    186{
    187	u32 year;
    188
    189	/* Rebase to the relative year which RTC hardware requires */
    190	year = tm->tm_year - MTK_RTC_TM_YR_OFFSET;
    191
    192	mtk_w32(hw, MTK_RTC_TREG(time_alarm, MTK_YEA), year);
    193	mtk_w32(hw, MTK_RTC_TREG(time_alarm, MTK_MON), tm->tm_mon + 1);
    194	mtk_w32(hw, MTK_RTC_TREG(time_alarm, MTK_DOW), tm->tm_wday);
    195	mtk_w32(hw, MTK_RTC_TREG(time_alarm, MTK_DOM), tm->tm_mday);
    196	mtk_w32(hw, MTK_RTC_TREG(time_alarm, MTK_HOU), tm->tm_hour);
    197	mtk_w32(hw, MTK_RTC_TREG(time_alarm, MTK_MIN), tm->tm_min);
    198	mtk_w32(hw, MTK_RTC_TREG(time_alarm, MTK_SEC), tm->tm_sec);
    199}
    200
    201static irqreturn_t mtk_rtc_alarmirq(int irq, void *id)
    202{
    203	struct mtk_rtc *hw = (struct mtk_rtc *)id;
    204	u32 irq_sta;
    205
    206	irq_sta = mtk_r32(hw, MTK_RTC_INT);
    207	if (irq_sta & RTC_INT_AL_STA) {
    208		/* Stop alarm also implicitly disables the alarm interrupt */
    209		mtk_w32(hw, MTK_RTC_AL_CTL, 0);
    210		rtc_update_irq(hw->rtc, 1, RTC_IRQF | RTC_AF);
    211
    212		/* Ack alarm interrupt status */
    213		mtk_w32(hw, MTK_RTC_INT, RTC_INT_AL_STA);
    214		return IRQ_HANDLED;
    215	}
    216
    217	return IRQ_NONE;
    218}
    219
    220static int mtk_rtc_gettime(struct device *dev, struct rtc_time *tm)
    221{
    222	struct mtk_rtc *hw = dev_get_drvdata(dev);
    223
    224	mtk_rtc_get_alarm_or_time(hw, tm, MTK_TC);
    225
    226	return 0;
    227}
    228
    229static int mtk_rtc_settime(struct device *dev, struct rtc_time *tm)
    230{
    231	struct mtk_rtc *hw = dev_get_drvdata(dev);
    232
    233	if (!MTK_RTC_TM_YR_VALID(tm->tm_year))
    234		return -EINVAL;
    235
    236	/* Stop time counter before setting a new one*/
    237	mtk_set(hw, MTK_RTC_CTL, RTC_RC_STOP);
    238
    239	mtk_rtc_set_alarm_or_time(hw, tm, MTK_TC);
    240
    241	/* Restart the time counter */
    242	mtk_clr(hw, MTK_RTC_CTL, RTC_RC_STOP);
    243
    244	return 0;
    245}
    246
    247static int mtk_rtc_getalarm(struct device *dev, struct rtc_wkalrm *wkalrm)
    248{
    249	struct mtk_rtc *hw = dev_get_drvdata(dev);
    250	struct rtc_time *alrm_tm = &wkalrm->time;
    251
    252	mtk_rtc_get_alarm_or_time(hw, alrm_tm, MTK_AL);
    253
    254	wkalrm->enabled = !!(mtk_r32(hw, MTK_RTC_AL_CTL) & RTC_AL_EN);
    255	wkalrm->pending = !!(mtk_r32(hw, MTK_RTC_INT) & RTC_INT_AL_STA);
    256
    257	return 0;
    258}
    259
    260static int mtk_rtc_setalarm(struct device *dev, struct rtc_wkalrm *wkalrm)
    261{
    262	struct mtk_rtc *hw = dev_get_drvdata(dev);
    263	struct rtc_time *alrm_tm = &wkalrm->time;
    264
    265	if (!MTK_RTC_TM_YR_VALID(alrm_tm->tm_year))
    266		return -EINVAL;
    267
    268	/*
    269	 * Stop the alarm also implicitly including disables interrupt before
    270	 * setting a new one.
    271	 */
    272	mtk_clr(hw, MTK_RTC_AL_CTL, RTC_AL_EN);
    273
    274	/*
    275	 * Avoid contention between mtk_rtc_setalarm and IRQ handler so that
    276	 * disabling the interrupt and awaiting for pending IRQ handler to
    277	 * complete.
    278	 */
    279	synchronize_irq(hw->irq);
    280
    281	mtk_rtc_set_alarm_or_time(hw, alrm_tm, MTK_AL);
    282
    283	/* Restart the alarm with the new setup */
    284	mtk_w32(hw, MTK_RTC_AL_CTL, RTC_AL_ALL);
    285
    286	return 0;
    287}
    288
    289static const struct rtc_class_ops mtk_rtc_ops = {
    290	.read_time		= mtk_rtc_gettime,
    291	.set_time		= mtk_rtc_settime,
    292	.read_alarm		= mtk_rtc_getalarm,
    293	.set_alarm		= mtk_rtc_setalarm,
    294};
    295
    296static const struct of_device_id mtk_rtc_match[] = {
    297	{ .compatible = "mediatek,mt7622-rtc" },
    298	{ .compatible = "mediatek,soc-rtc" },
    299	{},
    300};
    301MODULE_DEVICE_TABLE(of, mtk_rtc_match);
    302
    303static int mtk_rtc_probe(struct platform_device *pdev)
    304{
    305	struct mtk_rtc *hw;
    306	int ret;
    307
    308	hw = devm_kzalloc(&pdev->dev, sizeof(*hw), GFP_KERNEL);
    309	if (!hw)
    310		return -ENOMEM;
    311
    312	platform_set_drvdata(pdev, hw);
    313
    314	hw->base = devm_platform_ioremap_resource(pdev, 0);
    315	if (IS_ERR(hw->base))
    316		return PTR_ERR(hw->base);
    317
    318	hw->clk = devm_clk_get(&pdev->dev, "rtc");
    319	if (IS_ERR(hw->clk)) {
    320		dev_err(&pdev->dev, "No clock\n");
    321		return PTR_ERR(hw->clk);
    322	}
    323
    324	ret = clk_prepare_enable(hw->clk);
    325	if (ret)
    326		return ret;
    327
    328	hw->irq = platform_get_irq(pdev, 0);
    329	if (hw->irq < 0) {
    330		ret = hw->irq;
    331		goto err;
    332	}
    333
    334	ret = devm_request_irq(&pdev->dev, hw->irq, mtk_rtc_alarmirq,
    335			       0, dev_name(&pdev->dev), hw);
    336	if (ret) {
    337		dev_err(&pdev->dev, "Can't request IRQ\n");
    338		goto err;
    339	}
    340
    341	mtk_rtc_hw_init(hw);
    342
    343	device_init_wakeup(&pdev->dev, true);
    344
    345	hw->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
    346					   &mtk_rtc_ops, THIS_MODULE);
    347	if (IS_ERR(hw->rtc)) {
    348		ret = PTR_ERR(hw->rtc);
    349		dev_err(&pdev->dev, "Unable to register device\n");
    350		goto err;
    351	}
    352
    353	return 0;
    354err:
    355	clk_disable_unprepare(hw->clk);
    356
    357	return ret;
    358}
    359
    360static int mtk_rtc_remove(struct platform_device *pdev)
    361{
    362	struct mtk_rtc *hw = platform_get_drvdata(pdev);
    363
    364	clk_disable_unprepare(hw->clk);
    365
    366	return 0;
    367}
    368
    369#ifdef CONFIG_PM_SLEEP
    370static int mtk_rtc_suspend(struct device *dev)
    371{
    372	struct mtk_rtc *hw = dev_get_drvdata(dev);
    373
    374	if (device_may_wakeup(dev))
    375		enable_irq_wake(hw->irq);
    376
    377	return 0;
    378}
    379
    380static int mtk_rtc_resume(struct device *dev)
    381{
    382	struct mtk_rtc *hw = dev_get_drvdata(dev);
    383
    384	if (device_may_wakeup(dev))
    385		disable_irq_wake(hw->irq);
    386
    387	return 0;
    388}
    389
    390static SIMPLE_DEV_PM_OPS(mtk_rtc_pm_ops, mtk_rtc_suspend, mtk_rtc_resume);
    391
    392#define MTK_RTC_PM_OPS (&mtk_rtc_pm_ops)
    393#else	/* CONFIG_PM */
    394#define MTK_RTC_PM_OPS NULL
    395#endif	/* CONFIG_PM */
    396
    397static struct platform_driver mtk_rtc_driver = {
    398	.probe	= mtk_rtc_probe,
    399	.remove	= mtk_rtc_remove,
    400	.driver = {
    401		.name = MTK_RTC_DEV,
    402		.of_match_table = mtk_rtc_match,
    403		.pm = MTK_RTC_PM_OPS,
    404	},
    405};
    406
    407module_platform_driver(mtk_rtc_driver);
    408
    409MODULE_DESCRIPTION("MediaTek SoC based RTC Driver");
    410MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
    411MODULE_LICENSE("GPL");