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-ds1286.c (9253B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * DS1286 Real Time Clock interface for Linux
      4 *
      5 * Copyright (C) 1998, 1999, 2000 Ralf Baechle
      6 * Copyright (C) 2008 Thomas Bogendoerfer
      7 *
      8 * Based on code written by Paul Gortmaker.
      9 */
     10
     11#include <linux/module.h>
     12#include <linux/rtc.h>
     13#include <linux/platform_device.h>
     14#include <linux/bcd.h>
     15#include <linux/rtc/ds1286.h>
     16#include <linux/io.h>
     17#include <linux/slab.h>
     18
     19struct ds1286_priv {
     20	struct rtc_device *rtc;
     21	u32 __iomem *rtcregs;
     22	spinlock_t lock;
     23};
     24
     25static inline u8 ds1286_rtc_read(struct ds1286_priv *priv, int reg)
     26{
     27	return __raw_readl(&priv->rtcregs[reg]) & 0xff;
     28}
     29
     30static inline void ds1286_rtc_write(struct ds1286_priv *priv, u8 data, int reg)
     31{
     32	__raw_writel(data, &priv->rtcregs[reg]);
     33}
     34
     35
     36static int ds1286_alarm_irq_enable(struct device *dev, unsigned int enabled)
     37{
     38	struct ds1286_priv *priv = dev_get_drvdata(dev);
     39	unsigned long flags;
     40	unsigned char val;
     41
     42	/* Allow or mask alarm interrupts */
     43	spin_lock_irqsave(&priv->lock, flags);
     44	val = ds1286_rtc_read(priv, RTC_CMD);
     45	if (enabled)
     46		val &=  ~RTC_TDM;
     47	else
     48		val |=  RTC_TDM;
     49	ds1286_rtc_write(priv, val, RTC_CMD);
     50	spin_unlock_irqrestore(&priv->lock, flags);
     51
     52	return 0;
     53}
     54
     55#ifdef CONFIG_RTC_INTF_DEV
     56
     57static int ds1286_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
     58{
     59	struct ds1286_priv *priv = dev_get_drvdata(dev);
     60	unsigned long flags;
     61	unsigned char val;
     62
     63	switch (cmd) {
     64	case RTC_WIE_OFF:
     65		/* Mask watchdog int. enab. bit	*/
     66		spin_lock_irqsave(&priv->lock, flags);
     67		val = ds1286_rtc_read(priv, RTC_CMD);
     68		val |= RTC_WAM;
     69		ds1286_rtc_write(priv, val, RTC_CMD);
     70		spin_unlock_irqrestore(&priv->lock, flags);
     71		break;
     72	case RTC_WIE_ON:
     73		/* Allow watchdog interrupts.	*/
     74		spin_lock_irqsave(&priv->lock, flags);
     75		val = ds1286_rtc_read(priv, RTC_CMD);
     76		val &= ~RTC_WAM;
     77		ds1286_rtc_write(priv, val, RTC_CMD);
     78		spin_unlock_irqrestore(&priv->lock, flags);
     79		break;
     80	default:
     81		return -ENOIOCTLCMD;
     82	}
     83	return 0;
     84}
     85
     86#else
     87#define ds1286_ioctl    NULL
     88#endif
     89
     90#ifdef CONFIG_PROC_FS
     91
     92static int ds1286_proc(struct device *dev, struct seq_file *seq)
     93{
     94	struct ds1286_priv *priv = dev_get_drvdata(dev);
     95	unsigned char month, cmd, amode;
     96	const char *s;
     97
     98	month = ds1286_rtc_read(priv, RTC_MONTH);
     99	seq_printf(seq,
    100		   "oscillator\t: %s\n"
    101		   "square_wave\t: %s\n",
    102		   (month & RTC_EOSC) ? "disabled" : "enabled",
    103		   (month & RTC_ESQW) ? "disabled" : "enabled");
    104
    105	amode = ((ds1286_rtc_read(priv, RTC_MINUTES_ALARM) & 0x80) >> 5) |
    106		((ds1286_rtc_read(priv, RTC_HOURS_ALARM) & 0x80) >> 6) |
    107		((ds1286_rtc_read(priv, RTC_DAY_ALARM) & 0x80) >> 7);
    108	switch (amode) {
    109	case 7:
    110		s = "each minute";
    111		break;
    112	case 3:
    113		s = "minutes match";
    114		break;
    115	case 1:
    116		s = "hours and minutes match";
    117		break;
    118	case 0:
    119		s = "days, hours and minutes match";
    120		break;
    121	default:
    122		s = "invalid";
    123		break;
    124	}
    125	seq_printf(seq, "alarm_mode\t: %s\n", s);
    126
    127	cmd = ds1286_rtc_read(priv, RTC_CMD);
    128	seq_printf(seq,
    129		   "alarm_enable\t: %s\n"
    130		   "wdog_alarm\t: %s\n"
    131		   "alarm_mask\t: %s\n"
    132		   "wdog_alarm_mask\t: %s\n"
    133		   "interrupt_mode\t: %s\n"
    134		   "INTB_mode\t: %s_active\n"
    135		   "interrupt_pins\t: %s\n",
    136		   (cmd & RTC_TDF) ? "yes" : "no",
    137		   (cmd & RTC_WAF) ? "yes" : "no",
    138		   (cmd & RTC_TDM) ? "disabled" : "enabled",
    139		   (cmd & RTC_WAM) ? "disabled" : "enabled",
    140		   (cmd & RTC_PU_LVL) ? "pulse" : "level",
    141		   (cmd & RTC_IBH_LO) ? "low" : "high",
    142		   (cmd & RTC_IPSW) ? "unswapped" : "swapped");
    143	return 0;
    144}
    145
    146#else
    147#define ds1286_proc     NULL
    148#endif
    149
    150static int ds1286_read_time(struct device *dev, struct rtc_time *tm)
    151{
    152	struct ds1286_priv *priv = dev_get_drvdata(dev);
    153	unsigned char save_control;
    154	unsigned long flags;
    155	unsigned long uip_watchdog = jiffies;
    156
    157	/*
    158	 * read RTC once any update in progress is done. The update
    159	 * can take just over 2ms. We wait 10 to 20ms. There is no need to
    160	 * to poll-wait (up to 1s - eeccch) for the falling edge of RTC_UIP.
    161	 * If you need to know *exactly* when a second has started, enable
    162	 * periodic update complete interrupts, (via ioctl) and then
    163	 * immediately read /dev/rtc which will block until you get the IRQ.
    164	 * Once the read clears, read the RTC time (again via ioctl). Easy.
    165	 */
    166
    167	if (ds1286_rtc_read(priv, RTC_CMD) & RTC_TE)
    168		while (time_before(jiffies, uip_watchdog + 2*HZ/100))
    169			barrier();
    170
    171	/*
    172	 * Only the values that we read from the RTC are set. We leave
    173	 * tm_wday, tm_yday and tm_isdst untouched. Even though the
    174	 * RTC has RTC_DAY_OF_WEEK, we ignore it, as it is only updated
    175	 * by the RTC when initially set to a non-zero value.
    176	 */
    177	spin_lock_irqsave(&priv->lock, flags);
    178	save_control = ds1286_rtc_read(priv, RTC_CMD);
    179	ds1286_rtc_write(priv, (save_control|RTC_TE), RTC_CMD);
    180
    181	tm->tm_sec = ds1286_rtc_read(priv, RTC_SECONDS);
    182	tm->tm_min = ds1286_rtc_read(priv, RTC_MINUTES);
    183	tm->tm_hour = ds1286_rtc_read(priv, RTC_HOURS) & 0x3f;
    184	tm->tm_mday = ds1286_rtc_read(priv, RTC_DATE);
    185	tm->tm_mon = ds1286_rtc_read(priv, RTC_MONTH) & 0x1f;
    186	tm->tm_year = ds1286_rtc_read(priv, RTC_YEAR);
    187
    188	ds1286_rtc_write(priv, save_control, RTC_CMD);
    189	spin_unlock_irqrestore(&priv->lock, flags);
    190
    191	tm->tm_sec = bcd2bin(tm->tm_sec);
    192	tm->tm_min = bcd2bin(tm->tm_min);
    193	tm->tm_hour = bcd2bin(tm->tm_hour);
    194	tm->tm_mday = bcd2bin(tm->tm_mday);
    195	tm->tm_mon = bcd2bin(tm->tm_mon);
    196	tm->tm_year = bcd2bin(tm->tm_year);
    197
    198	/*
    199	 * Account for differences between how the RTC uses the values
    200	 * and how they are defined in a struct rtc_time;
    201	 */
    202	if (tm->tm_year < 45)
    203		tm->tm_year += 30;
    204	tm->tm_year += 40;
    205	if (tm->tm_year < 70)
    206		tm->tm_year += 100;
    207
    208	tm->tm_mon--;
    209
    210	return 0;
    211}
    212
    213static int ds1286_set_time(struct device *dev, struct rtc_time *tm)
    214{
    215	struct ds1286_priv *priv = dev_get_drvdata(dev);
    216	unsigned char mon, day, hrs, min, sec;
    217	unsigned char save_control;
    218	unsigned int yrs;
    219	unsigned long flags;
    220
    221	yrs = tm->tm_year + 1900;
    222	mon = tm->tm_mon + 1;   /* tm_mon starts at zero */
    223	day = tm->tm_mday;
    224	hrs = tm->tm_hour;
    225	min = tm->tm_min;
    226	sec = tm->tm_sec;
    227
    228	if (yrs < 1970)
    229		return -EINVAL;
    230
    231	yrs -= 1940;
    232	if (yrs > 255)    /* They are unsigned */
    233		return -EINVAL;
    234
    235	if (yrs >= 100)
    236		yrs -= 100;
    237
    238	sec = bin2bcd(sec);
    239	min = bin2bcd(min);
    240	hrs = bin2bcd(hrs);
    241	day = bin2bcd(day);
    242	mon = bin2bcd(mon);
    243	yrs = bin2bcd(yrs);
    244
    245	spin_lock_irqsave(&priv->lock, flags);
    246	save_control = ds1286_rtc_read(priv, RTC_CMD);
    247	ds1286_rtc_write(priv, (save_control|RTC_TE), RTC_CMD);
    248
    249	ds1286_rtc_write(priv, yrs, RTC_YEAR);
    250	ds1286_rtc_write(priv, mon, RTC_MONTH);
    251	ds1286_rtc_write(priv, day, RTC_DATE);
    252	ds1286_rtc_write(priv, hrs, RTC_HOURS);
    253	ds1286_rtc_write(priv, min, RTC_MINUTES);
    254	ds1286_rtc_write(priv, sec, RTC_SECONDS);
    255	ds1286_rtc_write(priv, 0, RTC_HUNDREDTH_SECOND);
    256
    257	ds1286_rtc_write(priv, save_control, RTC_CMD);
    258	spin_unlock_irqrestore(&priv->lock, flags);
    259	return 0;
    260}
    261
    262static int ds1286_read_alarm(struct device *dev, struct rtc_wkalrm *alm)
    263{
    264	struct ds1286_priv *priv = dev_get_drvdata(dev);
    265	unsigned long flags;
    266
    267	/*
    268	 * Only the values that we read from the RTC are set. That
    269	 * means only tm_wday, tm_hour, tm_min.
    270	 */
    271	spin_lock_irqsave(&priv->lock, flags);
    272	alm->time.tm_min = ds1286_rtc_read(priv, RTC_MINUTES_ALARM) & 0x7f;
    273	alm->time.tm_hour = ds1286_rtc_read(priv, RTC_HOURS_ALARM)  & 0x1f;
    274	alm->time.tm_wday = ds1286_rtc_read(priv, RTC_DAY_ALARM)    & 0x07;
    275	ds1286_rtc_read(priv, RTC_CMD);
    276	spin_unlock_irqrestore(&priv->lock, flags);
    277
    278	alm->time.tm_min = bcd2bin(alm->time.tm_min);
    279	alm->time.tm_hour = bcd2bin(alm->time.tm_hour);
    280	alm->time.tm_sec = 0;
    281	return 0;
    282}
    283
    284static int ds1286_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
    285{
    286	struct ds1286_priv *priv = dev_get_drvdata(dev);
    287	unsigned char hrs, min, sec;
    288
    289	hrs = alm->time.tm_hour;
    290	min = alm->time.tm_min;
    291	sec = alm->time.tm_sec;
    292
    293	if (hrs >= 24)
    294		hrs = 0xff;
    295
    296	if (min >= 60)
    297		min = 0xff;
    298
    299	if (sec != 0)
    300		return -EINVAL;
    301
    302	min = bin2bcd(min);
    303	hrs = bin2bcd(hrs);
    304
    305	spin_lock(&priv->lock);
    306	ds1286_rtc_write(priv, hrs, RTC_HOURS_ALARM);
    307	ds1286_rtc_write(priv, min, RTC_MINUTES_ALARM);
    308	spin_unlock(&priv->lock);
    309
    310	return 0;
    311}
    312
    313static const struct rtc_class_ops ds1286_ops = {
    314	.ioctl		= ds1286_ioctl,
    315	.proc		= ds1286_proc,
    316	.read_time	= ds1286_read_time,
    317	.set_time	= ds1286_set_time,
    318	.read_alarm	= ds1286_read_alarm,
    319	.set_alarm	= ds1286_set_alarm,
    320	.alarm_irq_enable = ds1286_alarm_irq_enable,
    321};
    322
    323static int ds1286_probe(struct platform_device *pdev)
    324{
    325	struct rtc_device *rtc;
    326	struct ds1286_priv *priv;
    327
    328	priv = devm_kzalloc(&pdev->dev, sizeof(struct ds1286_priv), GFP_KERNEL);
    329	if (!priv)
    330		return -ENOMEM;
    331
    332	priv->rtcregs = devm_platform_ioremap_resource(pdev, 0);
    333	if (IS_ERR(priv->rtcregs))
    334		return PTR_ERR(priv->rtcregs);
    335
    336	spin_lock_init(&priv->lock);
    337	platform_set_drvdata(pdev, priv);
    338	rtc = devm_rtc_device_register(&pdev->dev, "ds1286", &ds1286_ops,
    339					THIS_MODULE);
    340	if (IS_ERR(rtc))
    341		return PTR_ERR(rtc);
    342	priv->rtc = rtc;
    343	return 0;
    344}
    345
    346static struct platform_driver ds1286_platform_driver = {
    347	.driver		= {
    348		.name	= "rtc-ds1286",
    349	},
    350	.probe		= ds1286_probe,
    351};
    352
    353module_platform_driver(ds1286_platform_driver);
    354
    355MODULE_AUTHOR("Thomas Bogendoerfer <tsbogend@alpha.franken.de>");
    356MODULE_DESCRIPTION("DS1286 RTC driver");
    357MODULE_LICENSE("GPL");
    358MODULE_ALIAS("platform:rtc-ds1286");