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-isl1208.c (23532B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Intersil ISL1208 rtc class driver
      4 *
      5 * Copyright 2005,2006 Hebert Valerio Riedel <hvr@gnu.org>
      6 */
      7
      8#include <linux/bcd.h>
      9#include <linux/i2c.h>
     10#include <linux/module.h>
     11#include <linux/of_device.h>
     12#include <linux/of_irq.h>
     13#include <linux/rtc.h>
     14
     15/* Register map */
     16/* rtc section */
     17#define ISL1208_REG_SC  0x00
     18#define ISL1208_REG_MN  0x01
     19#define ISL1208_REG_HR  0x02
     20#define ISL1208_REG_HR_MIL     (1<<7)	/* 24h/12h mode */
     21#define ISL1208_REG_HR_PM      (1<<5)	/* PM/AM bit in 12h mode */
     22#define ISL1208_REG_DT  0x03
     23#define ISL1208_REG_MO  0x04
     24#define ISL1208_REG_YR  0x05
     25#define ISL1208_REG_DW  0x06
     26#define ISL1208_RTC_SECTION_LEN 7
     27
     28/* control/status section */
     29#define ISL1208_REG_SR  0x07
     30#define ISL1208_REG_SR_ARST    (1<<7)	/* auto reset */
     31#define ISL1208_REG_SR_XTOSCB  (1<<6)	/* crystal oscillator */
     32#define ISL1208_REG_SR_WRTC    (1<<4)	/* write rtc */
     33#define ISL1208_REG_SR_EVT     (1<<3)	/* event */
     34#define ISL1208_REG_SR_ALM     (1<<2)	/* alarm */
     35#define ISL1208_REG_SR_BAT     (1<<1)	/* battery */
     36#define ISL1208_REG_SR_RTCF    (1<<0)	/* rtc fail */
     37#define ISL1208_REG_INT 0x08
     38#define ISL1208_REG_INT_ALME   (1<<6)   /* alarm enable */
     39#define ISL1208_REG_INT_IM     (1<<7)   /* interrupt/alarm mode */
     40#define ISL1219_REG_EV  0x09
     41#define ISL1219_REG_EV_EVEN    (1<<4)   /* event detection enable */
     42#define ISL1219_REG_EV_EVIENB  (1<<7)   /* event in pull-up disable */
     43#define ISL1208_REG_ATR 0x0a
     44#define ISL1208_REG_DTR 0x0b
     45
     46/* alarm section */
     47#define ISL1208_REG_SCA 0x0c
     48#define ISL1208_REG_MNA 0x0d
     49#define ISL1208_REG_HRA 0x0e
     50#define ISL1208_REG_DTA 0x0f
     51#define ISL1208_REG_MOA 0x10
     52#define ISL1208_REG_DWA 0x11
     53#define ISL1208_ALARM_SECTION_LEN 6
     54
     55/* user section */
     56#define ISL1208_REG_USR1 0x12
     57#define ISL1208_REG_USR2 0x13
     58#define ISL1208_USR_SECTION_LEN 2
     59
     60/* event section */
     61#define ISL1219_REG_SCT 0x14
     62#define ISL1219_REG_MNT 0x15
     63#define ISL1219_REG_HRT 0x16
     64#define ISL1219_REG_DTT 0x17
     65#define ISL1219_REG_MOT 0x18
     66#define ISL1219_REG_YRT 0x19
     67#define ISL1219_EVT_SECTION_LEN 6
     68
     69static struct i2c_driver isl1208_driver;
     70
     71/* ISL1208 various variants */
     72enum isl1208_id {
     73	TYPE_ISL1208 = 0,
     74	TYPE_ISL1209,
     75	TYPE_ISL1218,
     76	TYPE_ISL1219,
     77	ISL_LAST_ID
     78};
     79
     80/* Chip capabilities table */
     81static const struct isl1208_config {
     82	const char	name[8];
     83	unsigned int	nvmem_length;
     84	unsigned	has_tamper:1;
     85	unsigned	has_timestamp:1;
     86} isl1208_configs[] = {
     87	[TYPE_ISL1208] = { "isl1208", 2, false, false },
     88	[TYPE_ISL1209] = { "isl1209", 2, true,  false },
     89	[TYPE_ISL1218] = { "isl1218", 8, false, false },
     90	[TYPE_ISL1219] = { "isl1219", 2, true,  true },
     91};
     92
     93static const struct i2c_device_id isl1208_id[] = {
     94	{ "isl1208", TYPE_ISL1208 },
     95	{ "isl1209", TYPE_ISL1209 },
     96	{ "isl1218", TYPE_ISL1218 },
     97	{ "isl1219", TYPE_ISL1219 },
     98	{ }
     99};
    100MODULE_DEVICE_TABLE(i2c, isl1208_id);
    101
    102static const __maybe_unused struct of_device_id isl1208_of_match[] = {
    103	{ .compatible = "isil,isl1208", .data = &isl1208_configs[TYPE_ISL1208] },
    104	{ .compatible = "isil,isl1209", .data = &isl1208_configs[TYPE_ISL1209] },
    105	{ .compatible = "isil,isl1218", .data = &isl1208_configs[TYPE_ISL1218] },
    106	{ .compatible = "isil,isl1219", .data = &isl1208_configs[TYPE_ISL1219] },
    107	{ }
    108};
    109MODULE_DEVICE_TABLE(of, isl1208_of_match);
    110
    111/* Device state */
    112struct isl1208_state {
    113	struct nvmem_config nvmem_config;
    114	struct rtc_device *rtc;
    115	const struct isl1208_config *config;
    116};
    117
    118/* block read */
    119static int
    120isl1208_i2c_read_regs(struct i2c_client *client, u8 reg, u8 buf[],
    121		      unsigned len)
    122{
    123	int ret;
    124
    125	WARN_ON(reg > ISL1219_REG_YRT);
    126	WARN_ON(reg + len > ISL1219_REG_YRT + 1);
    127
    128	ret = i2c_smbus_read_i2c_block_data(client, reg, len, buf);
    129	return (ret < 0) ? ret : 0;
    130}
    131
    132/* block write */
    133static int
    134isl1208_i2c_set_regs(struct i2c_client *client, u8 reg, u8 const buf[],
    135		     unsigned len)
    136{
    137	int ret;
    138
    139	WARN_ON(reg > ISL1219_REG_YRT);
    140	WARN_ON(reg + len > ISL1219_REG_YRT + 1);
    141
    142	ret = i2c_smbus_write_i2c_block_data(client, reg, len, buf);
    143	return (ret < 0) ? ret : 0;
    144}
    145
    146/* simple check to see whether we have a isl1208 */
    147static int
    148isl1208_i2c_validate_client(struct i2c_client *client)
    149{
    150	u8 regs[ISL1208_RTC_SECTION_LEN] = { 0, };
    151	u8 zero_mask[ISL1208_RTC_SECTION_LEN] = {
    152		0x80, 0x80, 0x40, 0xc0, 0xe0, 0x00, 0xf8
    153	};
    154	int i;
    155	int ret;
    156
    157	ret = isl1208_i2c_read_regs(client, 0, regs, ISL1208_RTC_SECTION_LEN);
    158	if (ret < 0)
    159		return ret;
    160
    161	for (i = 0; i < ISL1208_RTC_SECTION_LEN; ++i) {
    162		if (regs[i] & zero_mask[i])	/* check if bits are cleared */
    163			return -ENODEV;
    164	}
    165
    166	return 0;
    167}
    168
    169static int
    170isl1208_i2c_get_sr(struct i2c_client *client)
    171{
    172	return i2c_smbus_read_byte_data(client, ISL1208_REG_SR);
    173}
    174
    175static int
    176isl1208_i2c_get_atr(struct i2c_client *client)
    177{
    178	int atr = i2c_smbus_read_byte_data(client, ISL1208_REG_ATR);
    179	if (atr < 0)
    180		return atr;
    181
    182	/* The 6bit value in the ATR register controls the load
    183	 * capacitance C_load * in steps of 0.25pF
    184	 *
    185	 * bit (1<<5) of the ATR register is inverted
    186	 *
    187	 * C_load(ATR=0x20) =  4.50pF
    188	 * C_load(ATR=0x00) = 12.50pF
    189	 * C_load(ATR=0x1f) = 20.25pF
    190	 *
    191	 */
    192
    193	atr &= 0x3f;		/* mask out lsb */
    194	atr ^= 1 << 5;		/* invert 6th bit */
    195	atr += 2 * 9;		/* add offset of 4.5pF; unit[atr] = 0.25pF */
    196
    197	return atr;
    198}
    199
    200/* returns adjustment value + 100 */
    201static int
    202isl1208_i2c_get_dtr(struct i2c_client *client)
    203{
    204	int dtr = i2c_smbus_read_byte_data(client, ISL1208_REG_DTR);
    205	if (dtr < 0)
    206		return -EIO;
    207
    208	/* dtr encodes adjustments of {-60,-40,-20,0,20,40,60} ppm */
    209	dtr = ((dtr & 0x3) * 20) * (dtr & (1 << 2) ? -1 : 1);
    210
    211	return dtr + 100;
    212}
    213
    214static int
    215isl1208_i2c_get_usr(struct i2c_client *client)
    216{
    217	u8 buf[ISL1208_USR_SECTION_LEN] = { 0, };
    218	int ret;
    219
    220	ret = isl1208_i2c_read_regs(client, ISL1208_REG_USR1, buf,
    221				    ISL1208_USR_SECTION_LEN);
    222	if (ret < 0)
    223		return ret;
    224
    225	return (buf[1] << 8) | buf[0];
    226}
    227
    228static int
    229isl1208_i2c_set_usr(struct i2c_client *client, u16 usr)
    230{
    231	u8 buf[ISL1208_USR_SECTION_LEN];
    232
    233	buf[0] = usr & 0xff;
    234	buf[1] = (usr >> 8) & 0xff;
    235
    236	return isl1208_i2c_set_regs(client, ISL1208_REG_USR1, buf,
    237				    ISL1208_USR_SECTION_LEN);
    238}
    239
    240static int
    241isl1208_rtc_toggle_alarm(struct i2c_client *client, int enable)
    242{
    243	int icr = i2c_smbus_read_byte_data(client, ISL1208_REG_INT);
    244
    245	if (icr < 0) {
    246		dev_err(&client->dev, "%s: reading INT failed\n", __func__);
    247		return icr;
    248	}
    249
    250	if (enable)
    251		icr |= ISL1208_REG_INT_ALME | ISL1208_REG_INT_IM;
    252	else
    253		icr &= ~(ISL1208_REG_INT_ALME | ISL1208_REG_INT_IM);
    254
    255	icr = i2c_smbus_write_byte_data(client, ISL1208_REG_INT, icr);
    256	if (icr < 0) {
    257		dev_err(&client->dev, "%s: writing INT failed\n", __func__);
    258		return icr;
    259	}
    260
    261	return 0;
    262}
    263
    264static int
    265isl1208_rtc_proc(struct device *dev, struct seq_file *seq)
    266{
    267	struct i2c_client *const client = to_i2c_client(dev);
    268	int sr, dtr, atr, usr;
    269
    270	sr = isl1208_i2c_get_sr(client);
    271	if (sr < 0) {
    272		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
    273		return sr;
    274	}
    275
    276	seq_printf(seq, "status_reg\t:%s%s%s%s%s%s (0x%.2x)\n",
    277		   (sr & ISL1208_REG_SR_RTCF) ? " RTCF" : "",
    278		   (sr & ISL1208_REG_SR_BAT) ? " BAT" : "",
    279		   (sr & ISL1208_REG_SR_ALM) ? " ALM" : "",
    280		   (sr & ISL1208_REG_SR_WRTC) ? " WRTC" : "",
    281		   (sr & ISL1208_REG_SR_XTOSCB) ? " XTOSCB" : "",
    282		   (sr & ISL1208_REG_SR_ARST) ? " ARST" : "", sr);
    283
    284	seq_printf(seq, "batt_status\t: %s\n",
    285		   (sr & ISL1208_REG_SR_RTCF) ? "bad" : "okay");
    286
    287	dtr = isl1208_i2c_get_dtr(client);
    288	if (dtr >= 0)
    289		seq_printf(seq, "digital_trim\t: %d ppm\n", dtr - 100);
    290
    291	atr = isl1208_i2c_get_atr(client);
    292	if (atr >= 0)
    293		seq_printf(seq, "analog_trim\t: %d.%.2d pF\n",
    294			   atr >> 2, (atr & 0x3) * 25);
    295
    296	usr = isl1208_i2c_get_usr(client);
    297	if (usr >= 0)
    298		seq_printf(seq, "user_data\t: 0x%.4x\n", usr);
    299
    300	return 0;
    301}
    302
    303static int
    304isl1208_i2c_read_time(struct i2c_client *client, struct rtc_time *tm)
    305{
    306	int sr;
    307	u8 regs[ISL1208_RTC_SECTION_LEN] = { 0, };
    308
    309	sr = isl1208_i2c_get_sr(client);
    310	if (sr < 0) {
    311		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
    312		return -EIO;
    313	}
    314
    315	sr = isl1208_i2c_read_regs(client, 0, regs, ISL1208_RTC_SECTION_LEN);
    316	if (sr < 0) {
    317		dev_err(&client->dev, "%s: reading RTC section failed\n",
    318			__func__);
    319		return sr;
    320	}
    321
    322	tm->tm_sec = bcd2bin(regs[ISL1208_REG_SC]);
    323	tm->tm_min = bcd2bin(regs[ISL1208_REG_MN]);
    324
    325	/* HR field has a more complex interpretation */
    326	{
    327		const u8 _hr = regs[ISL1208_REG_HR];
    328		if (_hr & ISL1208_REG_HR_MIL)	/* 24h format */
    329			tm->tm_hour = bcd2bin(_hr & 0x3f);
    330		else {
    331			/* 12h format */
    332			tm->tm_hour = bcd2bin(_hr & 0x1f);
    333			if (_hr & ISL1208_REG_HR_PM)	/* PM flag set */
    334				tm->tm_hour += 12;
    335		}
    336	}
    337
    338	tm->tm_mday = bcd2bin(regs[ISL1208_REG_DT]);
    339	tm->tm_mon = bcd2bin(regs[ISL1208_REG_MO]) - 1;	/* rtc starts at 1 */
    340	tm->tm_year = bcd2bin(regs[ISL1208_REG_YR]) + 100;
    341	tm->tm_wday = bcd2bin(regs[ISL1208_REG_DW]);
    342
    343	return 0;
    344}
    345
    346static int
    347isl1208_i2c_read_alarm(struct i2c_client *client, struct rtc_wkalrm *alarm)
    348{
    349	struct rtc_time *const tm = &alarm->time;
    350	u8 regs[ISL1208_ALARM_SECTION_LEN] = { 0, };
    351	int icr, yr, sr = isl1208_i2c_get_sr(client);
    352
    353	if (sr < 0) {
    354		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
    355		return sr;
    356	}
    357
    358	sr = isl1208_i2c_read_regs(client, ISL1208_REG_SCA, regs,
    359				   ISL1208_ALARM_SECTION_LEN);
    360	if (sr < 0) {
    361		dev_err(&client->dev, "%s: reading alarm section failed\n",
    362			__func__);
    363		return sr;
    364	}
    365
    366	/* MSB of each alarm register is an enable bit */
    367	tm->tm_sec = bcd2bin(regs[ISL1208_REG_SCA - ISL1208_REG_SCA] & 0x7f);
    368	tm->tm_min = bcd2bin(regs[ISL1208_REG_MNA - ISL1208_REG_SCA] & 0x7f);
    369	tm->tm_hour = bcd2bin(regs[ISL1208_REG_HRA - ISL1208_REG_SCA] & 0x3f);
    370	tm->tm_mday = bcd2bin(regs[ISL1208_REG_DTA - ISL1208_REG_SCA] & 0x3f);
    371	tm->tm_mon =
    372		bcd2bin(regs[ISL1208_REG_MOA - ISL1208_REG_SCA] & 0x1f) - 1;
    373	tm->tm_wday = bcd2bin(regs[ISL1208_REG_DWA - ISL1208_REG_SCA] & 0x03);
    374
    375	/* The alarm doesn't store the year so get it from the rtc section */
    376	yr = i2c_smbus_read_byte_data(client, ISL1208_REG_YR);
    377	if (yr < 0) {
    378		dev_err(&client->dev, "%s: reading RTC YR failed\n", __func__);
    379		return yr;
    380	}
    381	tm->tm_year = bcd2bin(yr) + 100;
    382
    383	icr = i2c_smbus_read_byte_data(client, ISL1208_REG_INT);
    384	if (icr < 0) {
    385		dev_err(&client->dev, "%s: reading INT failed\n", __func__);
    386		return icr;
    387	}
    388	alarm->enabled = !!(icr & ISL1208_REG_INT_ALME);
    389
    390	return 0;
    391}
    392
    393static int
    394isl1208_i2c_set_alarm(struct i2c_client *client, struct rtc_wkalrm *alarm)
    395{
    396	struct rtc_time *alarm_tm = &alarm->time;
    397	u8 regs[ISL1208_ALARM_SECTION_LEN] = { 0, };
    398	const int offs = ISL1208_REG_SCA;
    399	struct rtc_time rtc_tm;
    400	int err, enable;
    401
    402	err = isl1208_i2c_read_time(client, &rtc_tm);
    403	if (err)
    404		return err;
    405
    406	/* If the alarm time is before the current time disable the alarm */
    407	if (!alarm->enabled || rtc_tm_sub(alarm_tm, &rtc_tm) <= 0)
    408		enable = 0x00;
    409	else
    410		enable = 0x80;
    411
    412	/* Program the alarm and enable it for each setting */
    413	regs[ISL1208_REG_SCA - offs] = bin2bcd(alarm_tm->tm_sec) | enable;
    414	regs[ISL1208_REG_MNA - offs] = bin2bcd(alarm_tm->tm_min) | enable;
    415	regs[ISL1208_REG_HRA - offs] = bin2bcd(alarm_tm->tm_hour) |
    416		ISL1208_REG_HR_MIL | enable;
    417
    418	regs[ISL1208_REG_DTA - offs] = bin2bcd(alarm_tm->tm_mday) | enable;
    419	regs[ISL1208_REG_MOA - offs] = bin2bcd(alarm_tm->tm_mon + 1) | enable;
    420	regs[ISL1208_REG_DWA - offs] = bin2bcd(alarm_tm->tm_wday & 7) | enable;
    421
    422	/* write ALARM registers */
    423	err = isl1208_i2c_set_regs(client, offs, regs,
    424				  ISL1208_ALARM_SECTION_LEN);
    425	if (err < 0) {
    426		dev_err(&client->dev, "%s: writing ALARM section failed\n",
    427			__func__);
    428		return err;
    429	}
    430
    431	err = isl1208_rtc_toggle_alarm(client, enable);
    432	if (err)
    433		return err;
    434
    435	return 0;
    436}
    437
    438static int
    439isl1208_rtc_read_time(struct device *dev, struct rtc_time *tm)
    440{
    441	return isl1208_i2c_read_time(to_i2c_client(dev), tm);
    442}
    443
    444static int
    445isl1208_i2c_set_time(struct i2c_client *client, struct rtc_time const *tm)
    446{
    447	int sr;
    448	u8 regs[ISL1208_RTC_SECTION_LEN] = { 0, };
    449
    450	/* The clock has an 8 bit wide bcd-coded register (they never learn)
    451	 * for the year. tm_year is an offset from 1900 and we are interested
    452	 * in the 2000-2099 range, so any value less than 100 is invalid.
    453	 */
    454	if (tm->tm_year < 100)
    455		return -EINVAL;
    456
    457	regs[ISL1208_REG_SC] = bin2bcd(tm->tm_sec);
    458	regs[ISL1208_REG_MN] = bin2bcd(tm->tm_min);
    459	regs[ISL1208_REG_HR] = bin2bcd(tm->tm_hour) | ISL1208_REG_HR_MIL;
    460
    461	regs[ISL1208_REG_DT] = bin2bcd(tm->tm_mday);
    462	regs[ISL1208_REG_MO] = bin2bcd(tm->tm_mon + 1);
    463	regs[ISL1208_REG_YR] = bin2bcd(tm->tm_year - 100);
    464
    465	regs[ISL1208_REG_DW] = bin2bcd(tm->tm_wday & 7);
    466
    467	sr = isl1208_i2c_get_sr(client);
    468	if (sr < 0) {
    469		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
    470		return sr;
    471	}
    472
    473	/* set WRTC */
    474	sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR,
    475				       sr | ISL1208_REG_SR_WRTC);
    476	if (sr < 0) {
    477		dev_err(&client->dev, "%s: writing SR failed\n", __func__);
    478		return sr;
    479	}
    480
    481	/* write RTC registers */
    482	sr = isl1208_i2c_set_regs(client, 0, regs, ISL1208_RTC_SECTION_LEN);
    483	if (sr < 0) {
    484		dev_err(&client->dev, "%s: writing RTC section failed\n",
    485			__func__);
    486		return sr;
    487	}
    488
    489	/* clear WRTC again */
    490	sr = isl1208_i2c_get_sr(client);
    491	if (sr < 0) {
    492		dev_err(&client->dev, "%s: reading SR failed\n", __func__);
    493		return sr;
    494	}
    495	sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR,
    496				       sr & ~ISL1208_REG_SR_WRTC);
    497	if (sr < 0) {
    498		dev_err(&client->dev, "%s: writing SR failed\n", __func__);
    499		return sr;
    500	}
    501
    502	return 0;
    503}
    504
    505
    506static int
    507isl1208_rtc_set_time(struct device *dev, struct rtc_time *tm)
    508{
    509	return isl1208_i2c_set_time(to_i2c_client(dev), tm);
    510}
    511
    512static int
    513isl1208_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
    514{
    515	return isl1208_i2c_read_alarm(to_i2c_client(dev), alarm);
    516}
    517
    518static int
    519isl1208_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
    520{
    521	return isl1208_i2c_set_alarm(to_i2c_client(dev), alarm);
    522}
    523
    524static ssize_t timestamp0_store(struct device *dev,
    525				struct device_attribute *attr,
    526				const char *buf, size_t count)
    527{
    528	struct i2c_client *client = to_i2c_client(dev->parent);
    529	int sr;
    530
    531	sr = isl1208_i2c_get_sr(client);
    532	if (sr < 0) {
    533		dev_err(dev, "%s: reading SR failed\n", __func__);
    534		return sr;
    535	}
    536
    537	sr &= ~ISL1208_REG_SR_EVT;
    538
    539	sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR, sr);
    540	if (sr < 0)
    541		dev_err(dev, "%s: writing SR failed\n",
    542			__func__);
    543
    544	return count;
    545};
    546
    547static ssize_t timestamp0_show(struct device *dev,
    548			       struct device_attribute *attr, char *buf)
    549{
    550	struct i2c_client *client = to_i2c_client(dev->parent);
    551	u8 regs[ISL1219_EVT_SECTION_LEN] = { 0, };
    552	struct rtc_time tm;
    553	int sr;
    554
    555	sr = isl1208_i2c_get_sr(client);
    556	if (sr < 0) {
    557		dev_err(dev, "%s: reading SR failed\n", __func__);
    558		return sr;
    559	}
    560
    561	if (!(sr & ISL1208_REG_SR_EVT))
    562		return 0;
    563
    564	sr = isl1208_i2c_read_regs(client, ISL1219_REG_SCT, regs,
    565				   ISL1219_EVT_SECTION_LEN);
    566	if (sr < 0) {
    567		dev_err(dev, "%s: reading event section failed\n",
    568			__func__);
    569		return 0;
    570	}
    571
    572	/* MSB of each alarm register is an enable bit */
    573	tm.tm_sec = bcd2bin(regs[ISL1219_REG_SCT - ISL1219_REG_SCT] & 0x7f);
    574	tm.tm_min = bcd2bin(regs[ISL1219_REG_MNT - ISL1219_REG_SCT] & 0x7f);
    575	tm.tm_hour = bcd2bin(regs[ISL1219_REG_HRT - ISL1219_REG_SCT] & 0x3f);
    576	tm.tm_mday = bcd2bin(regs[ISL1219_REG_DTT - ISL1219_REG_SCT] & 0x3f);
    577	tm.tm_mon =
    578		bcd2bin(regs[ISL1219_REG_MOT - ISL1219_REG_SCT] & 0x1f) - 1;
    579	tm.tm_year = bcd2bin(regs[ISL1219_REG_YRT - ISL1219_REG_SCT]) + 100;
    580
    581	sr = rtc_valid_tm(&tm);
    582	if (sr)
    583		return sr;
    584
    585	return sprintf(buf, "%llu\n",
    586				(unsigned long long)rtc_tm_to_time64(&tm));
    587};
    588
    589static DEVICE_ATTR_RW(timestamp0);
    590
    591static irqreturn_t
    592isl1208_rtc_interrupt(int irq, void *data)
    593{
    594	unsigned long timeout = jiffies + msecs_to_jiffies(1000);
    595	struct i2c_client *client = data;
    596	struct isl1208_state *isl1208 = i2c_get_clientdata(client);
    597	int handled = 0, sr, err;
    598
    599	/*
    600	 * I2C reads get NAK'ed if we read straight away after an interrupt?
    601	 * Using a mdelay/msleep didn't seem to help either, so we work around
    602	 * this by continually trying to read the register for a short time.
    603	 */
    604	while (1) {
    605		sr = isl1208_i2c_get_sr(client);
    606		if (sr >= 0)
    607			break;
    608
    609		if (time_after(jiffies, timeout)) {
    610			dev_err(&client->dev, "%s: reading SR failed\n",
    611				__func__);
    612			return sr;
    613		}
    614	}
    615
    616	if (sr & ISL1208_REG_SR_ALM) {
    617		dev_dbg(&client->dev, "alarm!\n");
    618
    619		rtc_update_irq(isl1208->rtc, 1, RTC_IRQF | RTC_AF);
    620
    621		/* Clear the alarm */
    622		sr &= ~ISL1208_REG_SR_ALM;
    623		sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR, sr);
    624		if (sr < 0)
    625			dev_err(&client->dev, "%s: writing SR failed\n",
    626				__func__);
    627		else
    628			handled = 1;
    629
    630		/* Disable the alarm */
    631		err = isl1208_rtc_toggle_alarm(client, 0);
    632		if (err)
    633			return err;
    634	}
    635
    636	if (isl1208->config->has_tamper && (sr & ISL1208_REG_SR_EVT)) {
    637		dev_warn(&client->dev, "event detected");
    638		handled = 1;
    639		if (isl1208->config->has_timestamp)
    640			sysfs_notify(&isl1208->rtc->dev.kobj, NULL,
    641				     dev_attr_timestamp0.attr.name);
    642	}
    643
    644	return handled ? IRQ_HANDLED : IRQ_NONE;
    645}
    646
    647static const struct rtc_class_ops isl1208_rtc_ops = {
    648	.proc = isl1208_rtc_proc,
    649	.read_time = isl1208_rtc_read_time,
    650	.set_time = isl1208_rtc_set_time,
    651	.read_alarm = isl1208_rtc_read_alarm,
    652	.set_alarm = isl1208_rtc_set_alarm,
    653};
    654
    655/* sysfs interface */
    656
    657static ssize_t
    658isl1208_sysfs_show_atrim(struct device *dev,
    659			 struct device_attribute *attr, char *buf)
    660{
    661	int atr = isl1208_i2c_get_atr(to_i2c_client(dev->parent));
    662	if (atr < 0)
    663		return atr;
    664
    665	return sprintf(buf, "%d.%.2d pF\n", atr >> 2, (atr & 0x3) * 25);
    666}
    667
    668static DEVICE_ATTR(atrim, S_IRUGO, isl1208_sysfs_show_atrim, NULL);
    669
    670static ssize_t
    671isl1208_sysfs_show_dtrim(struct device *dev,
    672			 struct device_attribute *attr, char *buf)
    673{
    674	int dtr = isl1208_i2c_get_dtr(to_i2c_client(dev->parent));
    675	if (dtr < 0)
    676		return dtr;
    677
    678	return sprintf(buf, "%d ppm\n", dtr - 100);
    679}
    680
    681static DEVICE_ATTR(dtrim, S_IRUGO, isl1208_sysfs_show_dtrim, NULL);
    682
    683static ssize_t
    684isl1208_sysfs_show_usr(struct device *dev,
    685		       struct device_attribute *attr, char *buf)
    686{
    687	int usr = isl1208_i2c_get_usr(to_i2c_client(dev->parent));
    688	if (usr < 0)
    689		return usr;
    690
    691	return sprintf(buf, "0x%.4x\n", usr);
    692}
    693
    694static ssize_t
    695isl1208_sysfs_store_usr(struct device *dev,
    696			struct device_attribute *attr,
    697			const char *buf, size_t count)
    698{
    699	int usr = -1;
    700
    701	if (buf[0] == '0' && (buf[1] == 'x' || buf[1] == 'X')) {
    702		if (sscanf(buf, "%x", &usr) != 1)
    703			return -EINVAL;
    704	} else {
    705		if (sscanf(buf, "%d", &usr) != 1)
    706			return -EINVAL;
    707	}
    708
    709	if (usr < 0 || usr > 0xffff)
    710		return -EINVAL;
    711
    712	if (isl1208_i2c_set_usr(to_i2c_client(dev->parent), usr))
    713		return -EIO;
    714
    715	return count;
    716}
    717
    718static DEVICE_ATTR(usr, S_IRUGO | S_IWUSR, isl1208_sysfs_show_usr,
    719		   isl1208_sysfs_store_usr);
    720
    721static struct attribute *isl1208_rtc_attrs[] = {
    722	&dev_attr_atrim.attr,
    723	&dev_attr_dtrim.attr,
    724	&dev_attr_usr.attr,
    725	NULL
    726};
    727
    728static const struct attribute_group isl1208_rtc_sysfs_files = {
    729	.attrs	= isl1208_rtc_attrs,
    730};
    731
    732static struct attribute *isl1219_rtc_attrs[] = {
    733	&dev_attr_timestamp0.attr,
    734	NULL
    735};
    736
    737static const struct attribute_group isl1219_rtc_sysfs_files = {
    738	.attrs	= isl1219_rtc_attrs,
    739};
    740
    741static int isl1208_nvmem_read(void *priv, unsigned int off, void *buf,
    742			      size_t count)
    743{
    744	struct isl1208_state *isl1208 = priv;
    745	struct i2c_client *client = to_i2c_client(isl1208->rtc->dev.parent);
    746	int ret;
    747
    748	/* nvmem sanitizes offset/count for us, but count==0 is possible */
    749	if (!count)
    750		return count;
    751	ret = isl1208_i2c_read_regs(client, ISL1208_REG_USR1 + off, buf,
    752				    count);
    753	return ret == 0 ? count : ret;
    754}
    755
    756static int isl1208_nvmem_write(void *priv, unsigned int off, void *buf,
    757			       size_t count)
    758{
    759	struct isl1208_state *isl1208 = priv;
    760	struct i2c_client *client = to_i2c_client(isl1208->rtc->dev.parent);
    761	int ret;
    762
    763	/* nvmem sanitizes off/count for us, but count==0 is possible */
    764	if (!count)
    765		return count;
    766	ret = isl1208_i2c_set_regs(client, ISL1208_REG_USR1 + off, buf,
    767				   count);
    768
    769	return ret == 0 ? count : ret;
    770}
    771
    772static const struct nvmem_config isl1208_nvmem_config = {
    773	.name = "isl1208_nvram",
    774	.word_size = 1,
    775	.stride = 1,
    776	/* .size from chip specific config */
    777	.reg_read = isl1208_nvmem_read,
    778	.reg_write = isl1208_nvmem_write,
    779};
    780
    781static int isl1208_setup_irq(struct i2c_client *client, int irq)
    782{
    783	int rc = devm_request_threaded_irq(&client->dev, irq, NULL,
    784					isl1208_rtc_interrupt,
    785					IRQF_SHARED | IRQF_ONESHOT,
    786					isl1208_driver.driver.name,
    787					client);
    788	if (!rc) {
    789		device_init_wakeup(&client->dev, 1);
    790		enable_irq_wake(irq);
    791	} else {
    792		dev_err(&client->dev,
    793			"Unable to request irq %d, no alarm support\n",
    794			irq);
    795	}
    796	return rc;
    797}
    798
    799static int
    800isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id)
    801{
    802	int rc = 0;
    803	struct isl1208_state *isl1208;
    804	int evdet_irq = -1;
    805
    806	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
    807		return -ENODEV;
    808
    809	if (isl1208_i2c_validate_client(client) < 0)
    810		return -ENODEV;
    811
    812	/* Allocate driver state, point i2c client data to it */
    813	isl1208 = devm_kzalloc(&client->dev, sizeof(*isl1208), GFP_KERNEL);
    814	if (!isl1208)
    815		return -ENOMEM;
    816	i2c_set_clientdata(client, isl1208);
    817
    818	/* Determine which chip we have */
    819	if (client->dev.of_node) {
    820		isl1208->config = of_device_get_match_data(&client->dev);
    821		if (!isl1208->config)
    822			return -ENODEV;
    823	} else {
    824		if (id->driver_data >= ISL_LAST_ID)
    825			return -ENODEV;
    826		isl1208->config = &isl1208_configs[id->driver_data];
    827	}
    828
    829	isl1208->rtc = devm_rtc_allocate_device(&client->dev);
    830	if (IS_ERR(isl1208->rtc))
    831		return PTR_ERR(isl1208->rtc);
    832
    833	isl1208->rtc->ops = &isl1208_rtc_ops;
    834
    835	/* Setup nvmem configuration in driver state struct */
    836	isl1208->nvmem_config = isl1208_nvmem_config;
    837	isl1208->nvmem_config.size = isl1208->config->nvmem_length;
    838	isl1208->nvmem_config.priv = isl1208;
    839
    840	rc = isl1208_i2c_get_sr(client);
    841	if (rc < 0) {
    842		dev_err(&client->dev, "reading status failed\n");
    843		return rc;
    844	}
    845
    846	if (rc & ISL1208_REG_SR_RTCF)
    847		dev_warn(&client->dev, "rtc power failure detected, "
    848			 "please set clock.\n");
    849
    850	if (isl1208->config->has_tamper) {
    851		struct device_node *np = client->dev.of_node;
    852		u32 evienb;
    853
    854		rc = i2c_smbus_read_byte_data(client, ISL1219_REG_EV);
    855		if (rc < 0) {
    856			dev_err(&client->dev, "failed to read EV reg\n");
    857			return rc;
    858		}
    859		rc |= ISL1219_REG_EV_EVEN;
    860		if (!of_property_read_u32(np, "isil,ev-evienb", &evienb)) {
    861			if (evienb)
    862				rc |= ISL1219_REG_EV_EVIENB;
    863			else
    864				rc &= ~ISL1219_REG_EV_EVIENB;
    865		}
    866		rc = i2c_smbus_write_byte_data(client, ISL1219_REG_EV, rc);
    867		if (rc < 0) {
    868			dev_err(&client->dev, "could not enable tamper detection\n");
    869			return rc;
    870		}
    871		evdet_irq = of_irq_get_byname(np, "evdet");
    872	}
    873	if (isl1208->config->has_timestamp) {
    874		rc = rtc_add_group(isl1208->rtc, &isl1219_rtc_sysfs_files);
    875		if (rc)
    876			return rc;
    877	}
    878
    879	rc = rtc_add_group(isl1208->rtc, &isl1208_rtc_sysfs_files);
    880	if (rc)
    881		return rc;
    882
    883	if (client->irq > 0)
    884		rc = isl1208_setup_irq(client, client->irq);
    885	if (rc)
    886		return rc;
    887
    888	if (evdet_irq > 0 && evdet_irq != client->irq)
    889		rc = isl1208_setup_irq(client, evdet_irq);
    890	if (rc)
    891		return rc;
    892
    893	rc = devm_rtc_nvmem_register(isl1208->rtc, &isl1208->nvmem_config);
    894	if (rc)
    895		return rc;
    896
    897	return devm_rtc_register_device(isl1208->rtc);
    898}
    899
    900static struct i2c_driver isl1208_driver = {
    901	.driver = {
    902		.name = "rtc-isl1208",
    903		.of_match_table = of_match_ptr(isl1208_of_match),
    904	},
    905	.probe = isl1208_probe,
    906	.id_table = isl1208_id,
    907};
    908
    909module_i2c_driver(isl1208_driver);
    910
    911MODULE_AUTHOR("Herbert Valerio Riedel <hvr@gnu.org>");
    912MODULE_DESCRIPTION("Intersil ISL1208 RTC driver");
    913MODULE_LICENSE("GPL");