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-rv3028.c (23442B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * RTC driver for the Micro Crystal RV3028
      4 *
      5 * Copyright (C) 2019 Micro Crystal SA
      6 *
      7 * Alexandre Belloni <alexandre.belloni@bootlin.com>
      8 *
      9 */
     10
     11#include <linux/clk-provider.h>
     12#include <linux/bcd.h>
     13#include <linux/bitfield.h>
     14#include <linux/bitops.h>
     15#include <linux/i2c.h>
     16#include <linux/interrupt.h>
     17#include <linux/kernel.h>
     18#include <linux/log2.h>
     19#include <linux/module.h>
     20#include <linux/of_device.h>
     21#include <linux/regmap.h>
     22#include <linux/rtc.h>
     23
     24#define RV3028_SEC			0x00
     25#define RV3028_MIN			0x01
     26#define RV3028_HOUR			0x02
     27#define RV3028_WDAY			0x03
     28#define RV3028_DAY			0x04
     29#define RV3028_MONTH			0x05
     30#define RV3028_YEAR			0x06
     31#define RV3028_ALARM_MIN		0x07
     32#define RV3028_ALARM_HOUR		0x08
     33#define RV3028_ALARM_DAY		0x09
     34#define RV3028_STATUS			0x0E
     35#define RV3028_CTRL1			0x0F
     36#define RV3028_CTRL2			0x10
     37#define RV3028_EVT_CTRL			0x13
     38#define RV3028_TS_COUNT			0x14
     39#define RV3028_TS_SEC			0x15
     40#define RV3028_RAM1			0x1F
     41#define RV3028_EEPROM_ADDR		0x25
     42#define RV3028_EEPROM_DATA		0x26
     43#define RV3028_EEPROM_CMD		0x27
     44#define RV3028_CLKOUT			0x35
     45#define RV3028_OFFSET			0x36
     46#define RV3028_BACKUP			0x37
     47
     48#define RV3028_STATUS_PORF		BIT(0)
     49#define RV3028_STATUS_EVF		BIT(1)
     50#define RV3028_STATUS_AF		BIT(2)
     51#define RV3028_STATUS_TF		BIT(3)
     52#define RV3028_STATUS_UF		BIT(4)
     53#define RV3028_STATUS_BSF		BIT(5)
     54#define RV3028_STATUS_CLKF		BIT(6)
     55#define RV3028_STATUS_EEBUSY		BIT(7)
     56
     57#define RV3028_CLKOUT_FD_MASK		GENMASK(2, 0)
     58#define RV3028_CLKOUT_PORIE		BIT(3)
     59#define RV3028_CLKOUT_CLKSY		BIT(6)
     60#define RV3028_CLKOUT_CLKOE		BIT(7)
     61
     62#define RV3028_CTRL1_EERD		BIT(3)
     63#define RV3028_CTRL1_WADA		BIT(5)
     64
     65#define RV3028_CTRL2_RESET		BIT(0)
     66#define RV3028_CTRL2_12_24		BIT(1)
     67#define RV3028_CTRL2_EIE		BIT(2)
     68#define RV3028_CTRL2_AIE		BIT(3)
     69#define RV3028_CTRL2_TIE		BIT(4)
     70#define RV3028_CTRL2_UIE		BIT(5)
     71#define RV3028_CTRL2_TSE		BIT(7)
     72
     73#define RV3028_EVT_CTRL_TSR		BIT(2)
     74
     75#define RV3028_EEPROM_CMD_UPDATE	0x11
     76#define RV3028_EEPROM_CMD_WRITE		0x21
     77#define RV3028_EEPROM_CMD_READ		0x22
     78
     79#define RV3028_EEBUSY_POLL		10000
     80#define RV3028_EEBUSY_TIMEOUT		100000
     81
     82#define RV3028_BACKUP_TCE		BIT(5)
     83#define RV3028_BACKUP_TCR_MASK		GENMASK(1,0)
     84#define RV3028_BACKUP_BSM		GENMASK(3,2)
     85
     86#define RV3028_BACKUP_BSM_DSM		0x1
     87#define RV3028_BACKUP_BSM_LSM		0x3
     88
     89#define OFFSET_STEP_PPT			953674
     90
     91enum rv3028_type {
     92	rv_3028,
     93};
     94
     95struct rv3028_data {
     96	struct regmap *regmap;
     97	struct rtc_device *rtc;
     98	enum rv3028_type type;
     99#ifdef CONFIG_COMMON_CLK
    100	struct clk_hw clkout_hw;
    101#endif
    102};
    103
    104static u16 rv3028_trickle_resistors[] = {3000, 5000, 9000, 15000};
    105
    106static ssize_t timestamp0_store(struct device *dev,
    107				struct device_attribute *attr,
    108				const char *buf, size_t count)
    109{
    110	struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent);
    111
    112	regmap_update_bits(rv3028->regmap, RV3028_EVT_CTRL, RV3028_EVT_CTRL_TSR,
    113			   RV3028_EVT_CTRL_TSR);
    114
    115	return count;
    116};
    117
    118static ssize_t timestamp0_show(struct device *dev,
    119			       struct device_attribute *attr, char *buf)
    120{
    121	struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent);
    122	struct rtc_time tm;
    123	int ret, count;
    124	u8 date[6];
    125
    126	ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count);
    127	if (ret)
    128		return ret;
    129
    130	if (!count)
    131		return 0;
    132
    133	ret = regmap_bulk_read(rv3028->regmap, RV3028_TS_SEC, date,
    134			       sizeof(date));
    135	if (ret)
    136		return ret;
    137
    138	tm.tm_sec = bcd2bin(date[0]);
    139	tm.tm_min = bcd2bin(date[1]);
    140	tm.tm_hour = bcd2bin(date[2]);
    141	tm.tm_mday = bcd2bin(date[3]);
    142	tm.tm_mon = bcd2bin(date[4]) - 1;
    143	tm.tm_year = bcd2bin(date[5]) + 100;
    144
    145	ret = rtc_valid_tm(&tm);
    146	if (ret)
    147		return ret;
    148
    149	return sprintf(buf, "%llu\n",
    150		       (unsigned long long)rtc_tm_to_time64(&tm));
    151};
    152
    153static DEVICE_ATTR_RW(timestamp0);
    154
    155static ssize_t timestamp0_count_show(struct device *dev,
    156				     struct device_attribute *attr, char *buf)
    157{
    158	struct rv3028_data *rv3028 = dev_get_drvdata(dev->parent);
    159	int ret, count;
    160
    161	ret = regmap_read(rv3028->regmap, RV3028_TS_COUNT, &count);
    162	if (ret)
    163		return ret;
    164
    165	return sprintf(buf, "%u\n", count);
    166};
    167
    168static DEVICE_ATTR_RO(timestamp0_count);
    169
    170static struct attribute *rv3028_attrs[] = {
    171	&dev_attr_timestamp0.attr,
    172	&dev_attr_timestamp0_count.attr,
    173	NULL
    174};
    175
    176static const struct attribute_group rv3028_attr_group = {
    177	.attrs	= rv3028_attrs,
    178};
    179
    180static int rv3028_exit_eerd(struct rv3028_data *rv3028, u32 eerd)
    181{
    182	if (eerd)
    183		return 0;
    184
    185	return regmap_update_bits(rv3028->regmap, RV3028_CTRL1, RV3028_CTRL1_EERD, 0);
    186}
    187
    188static int rv3028_enter_eerd(struct rv3028_data *rv3028, u32 *eerd)
    189{
    190	u32 ctrl1, status;
    191	int ret;
    192
    193	ret = regmap_read(rv3028->regmap, RV3028_CTRL1, &ctrl1);
    194	if (ret)
    195		return ret;
    196
    197	*eerd = ctrl1 & RV3028_CTRL1_EERD;
    198	if (*eerd)
    199		return 0;
    200
    201	ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL1,
    202				 RV3028_CTRL1_EERD, RV3028_CTRL1_EERD);
    203	if (ret)
    204		return ret;
    205
    206	ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status,
    207				       !(status & RV3028_STATUS_EEBUSY),
    208				       RV3028_EEBUSY_POLL, RV3028_EEBUSY_TIMEOUT);
    209	if (ret) {
    210		rv3028_exit_eerd(rv3028, *eerd);
    211
    212		return ret;
    213	}
    214
    215	return 0;
    216}
    217
    218static int rv3028_update_eeprom(struct rv3028_data *rv3028, u32 eerd)
    219{
    220	u32 status;
    221	int ret;
    222
    223	ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0);
    224	if (ret)
    225		goto exit_eerd;
    226
    227	ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, RV3028_EEPROM_CMD_UPDATE);
    228	if (ret)
    229		goto exit_eerd;
    230
    231	usleep_range(63000, RV3028_EEBUSY_TIMEOUT);
    232
    233	ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status,
    234				       !(status & RV3028_STATUS_EEBUSY),
    235				       RV3028_EEBUSY_POLL, RV3028_EEBUSY_TIMEOUT);
    236
    237exit_eerd:
    238	rv3028_exit_eerd(rv3028, eerd);
    239
    240	return ret;
    241}
    242
    243static int rv3028_update_cfg(struct rv3028_data *rv3028, unsigned int reg,
    244			     unsigned int mask, unsigned int val)
    245{
    246	u32 eerd;
    247	int ret;
    248
    249	ret = rv3028_enter_eerd(rv3028, &eerd);
    250	if (ret)
    251		return ret;
    252
    253	ret = regmap_update_bits(rv3028->regmap, reg, mask, val);
    254	if (ret) {
    255		rv3028_exit_eerd(rv3028, eerd);
    256		return ret;
    257	}
    258
    259	return rv3028_update_eeprom(rv3028, eerd);
    260}
    261
    262static irqreturn_t rv3028_handle_irq(int irq, void *dev_id)
    263{
    264	struct rv3028_data *rv3028 = dev_id;
    265	unsigned long events = 0;
    266	u32 status = 0, ctrl = 0;
    267
    268	if (regmap_read(rv3028->regmap, RV3028_STATUS, &status) < 0 ||
    269	   status == 0) {
    270		return IRQ_NONE;
    271	}
    272
    273	status &= ~RV3028_STATUS_PORF;
    274
    275	if (status & RV3028_STATUS_TF) {
    276		status |= RV3028_STATUS_TF;
    277		ctrl |= RV3028_CTRL2_TIE;
    278		events |= RTC_PF;
    279	}
    280
    281	if (status & RV3028_STATUS_AF) {
    282		status |= RV3028_STATUS_AF;
    283		ctrl |= RV3028_CTRL2_AIE;
    284		events |= RTC_AF;
    285	}
    286
    287	if (status & RV3028_STATUS_UF) {
    288		status |= RV3028_STATUS_UF;
    289		ctrl |= RV3028_CTRL2_UIE;
    290		events |= RTC_UF;
    291	}
    292
    293	if (events) {
    294		rtc_update_irq(rv3028->rtc, 1, events);
    295		regmap_update_bits(rv3028->regmap, RV3028_STATUS, status, 0);
    296		regmap_update_bits(rv3028->regmap, RV3028_CTRL2, ctrl, 0);
    297	}
    298
    299	if (status & RV3028_STATUS_EVF) {
    300		sysfs_notify(&rv3028->rtc->dev.kobj, NULL,
    301			     dev_attr_timestamp0.attr.name);
    302		dev_warn(&rv3028->rtc->dev, "event detected");
    303	}
    304
    305	return IRQ_HANDLED;
    306}
    307
    308static int rv3028_get_time(struct device *dev, struct rtc_time *tm)
    309{
    310	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
    311	u8 date[7];
    312	int ret, status;
    313
    314	ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status);
    315	if (ret < 0)
    316		return ret;
    317
    318	if (status & RV3028_STATUS_PORF)
    319		return -EINVAL;
    320
    321	ret = regmap_bulk_read(rv3028->regmap, RV3028_SEC, date, sizeof(date));
    322	if (ret)
    323		return ret;
    324
    325	tm->tm_sec  = bcd2bin(date[RV3028_SEC] & 0x7f);
    326	tm->tm_min  = bcd2bin(date[RV3028_MIN] & 0x7f);
    327	tm->tm_hour = bcd2bin(date[RV3028_HOUR] & 0x3f);
    328	tm->tm_wday = date[RV3028_WDAY] & 0x7f;
    329	tm->tm_mday = bcd2bin(date[RV3028_DAY] & 0x3f);
    330	tm->tm_mon  = bcd2bin(date[RV3028_MONTH] & 0x1f) - 1;
    331	tm->tm_year = bcd2bin(date[RV3028_YEAR]) + 100;
    332
    333	return 0;
    334}
    335
    336static int rv3028_set_time(struct device *dev, struct rtc_time *tm)
    337{
    338	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
    339	u8 date[7];
    340	int ret;
    341
    342	date[RV3028_SEC]   = bin2bcd(tm->tm_sec);
    343	date[RV3028_MIN]   = bin2bcd(tm->tm_min);
    344	date[RV3028_HOUR]  = bin2bcd(tm->tm_hour);
    345	date[RV3028_WDAY]  = tm->tm_wday;
    346	date[RV3028_DAY]   = bin2bcd(tm->tm_mday);
    347	date[RV3028_MONTH] = bin2bcd(tm->tm_mon + 1);
    348	date[RV3028_YEAR]  = bin2bcd(tm->tm_year - 100);
    349
    350	/*
    351	 * Writing to the Seconds register has the same effect as setting RESET
    352	 * bit to 1
    353	 */
    354	ret = regmap_bulk_write(rv3028->regmap, RV3028_SEC, date,
    355				sizeof(date));
    356	if (ret)
    357		return ret;
    358
    359	ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS,
    360				 RV3028_STATUS_PORF, 0);
    361
    362	return ret;
    363}
    364
    365static int rv3028_get_alarm(struct device *dev, struct rtc_wkalrm *alrm)
    366{
    367	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
    368	u8 alarmvals[3];
    369	int status, ctrl, ret;
    370
    371	ret = regmap_bulk_read(rv3028->regmap, RV3028_ALARM_MIN, alarmvals,
    372			       sizeof(alarmvals));
    373	if (ret)
    374		return ret;
    375
    376	ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status);
    377	if (ret < 0)
    378		return ret;
    379
    380	ret = regmap_read(rv3028->regmap, RV3028_CTRL2, &ctrl);
    381	if (ret < 0)
    382		return ret;
    383
    384	alrm->time.tm_sec  = 0;
    385	alrm->time.tm_min  = bcd2bin(alarmvals[0] & 0x7f);
    386	alrm->time.tm_hour = bcd2bin(alarmvals[1] & 0x3f);
    387	alrm->time.tm_mday = bcd2bin(alarmvals[2] & 0x3f);
    388
    389	alrm->enabled = !!(ctrl & RV3028_CTRL2_AIE);
    390	alrm->pending = (status & RV3028_STATUS_AF) && alrm->enabled;
    391
    392	return 0;
    393}
    394
    395static int rv3028_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
    396{
    397	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
    398	u8 alarmvals[3];
    399	u8 ctrl = 0;
    400	int ret;
    401
    402	/* The alarm has no seconds, round up to nearest minute */
    403	if (alrm->time.tm_sec) {
    404		time64_t alarm_time = rtc_tm_to_time64(&alrm->time);
    405
    406		alarm_time += 60 - alrm->time.tm_sec;
    407		rtc_time64_to_tm(alarm_time, &alrm->time);
    408	}
    409
    410	ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2,
    411				 RV3028_CTRL2_AIE | RV3028_CTRL2_UIE, 0);
    412	if (ret)
    413		return ret;
    414
    415	alarmvals[0] = bin2bcd(alrm->time.tm_min);
    416	alarmvals[1] = bin2bcd(alrm->time.tm_hour);
    417	alarmvals[2] = bin2bcd(alrm->time.tm_mday);
    418
    419	ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS,
    420				 RV3028_STATUS_AF, 0);
    421	if (ret)
    422		return ret;
    423
    424	ret = regmap_bulk_write(rv3028->regmap, RV3028_ALARM_MIN, alarmvals,
    425				sizeof(alarmvals));
    426	if (ret)
    427		return ret;
    428
    429	if (alrm->enabled) {
    430		if (rv3028->rtc->uie_rtctimer.enabled)
    431			ctrl |= RV3028_CTRL2_UIE;
    432		if (rv3028->rtc->aie_timer.enabled)
    433			ctrl |= RV3028_CTRL2_AIE;
    434	}
    435
    436	ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2,
    437				 RV3028_CTRL2_UIE | RV3028_CTRL2_AIE, ctrl);
    438
    439	return ret;
    440}
    441
    442static int rv3028_alarm_irq_enable(struct device *dev, unsigned int enabled)
    443{
    444	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
    445	int ctrl = 0, ret;
    446
    447	if (enabled) {
    448		if (rv3028->rtc->uie_rtctimer.enabled)
    449			ctrl |= RV3028_CTRL2_UIE;
    450		if (rv3028->rtc->aie_timer.enabled)
    451			ctrl |= RV3028_CTRL2_AIE;
    452	}
    453
    454	ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS,
    455				 RV3028_STATUS_AF | RV3028_STATUS_UF, 0);
    456	if (ret)
    457		return ret;
    458
    459	ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2,
    460				 RV3028_CTRL2_UIE | RV3028_CTRL2_AIE, ctrl);
    461	if (ret)
    462		return ret;
    463
    464	return 0;
    465}
    466
    467static int rv3028_read_offset(struct device *dev, long *offset)
    468{
    469	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
    470	int ret, value, steps;
    471
    472	ret = regmap_read(rv3028->regmap, RV3028_OFFSET, &value);
    473	if (ret < 0)
    474		return ret;
    475
    476	steps = sign_extend32(value << 1, 8);
    477
    478	ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value);
    479	if (ret < 0)
    480		return ret;
    481
    482	steps += value >> 7;
    483
    484	*offset = DIV_ROUND_CLOSEST(steps * OFFSET_STEP_PPT, 1000);
    485
    486	return 0;
    487}
    488
    489static int rv3028_set_offset(struct device *dev, long offset)
    490{
    491	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
    492	u32 eerd;
    493	int ret;
    494
    495	offset = clamp(offset, -244141L, 243187L) * 1000;
    496	offset = DIV_ROUND_CLOSEST(offset, OFFSET_STEP_PPT);
    497
    498	ret = rv3028_enter_eerd(rv3028, &eerd);
    499	if (ret)
    500		return ret;
    501
    502	ret = regmap_write(rv3028->regmap, RV3028_OFFSET, offset >> 1);
    503	if (ret < 0)
    504		goto exit_eerd;
    505
    506	ret = regmap_update_bits(rv3028->regmap, RV3028_BACKUP, BIT(7),
    507				 offset << 7);
    508	if (ret < 0)
    509		goto exit_eerd;
    510
    511	return rv3028_update_eeprom(rv3028, eerd);
    512
    513exit_eerd:
    514	rv3028_exit_eerd(rv3028, eerd);
    515
    516	return ret;
    517
    518}
    519
    520static int rv3028_param_get(struct device *dev, struct rtc_param *param)
    521{
    522	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
    523	int ret;
    524
    525	switch(param->param) {
    526		u32 value;
    527
    528	case RTC_PARAM_BACKUP_SWITCH_MODE:
    529		ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &value);
    530		if (ret < 0)
    531			return ret;
    532
    533		value = FIELD_GET(RV3028_BACKUP_BSM, value);
    534
    535		switch(value) {
    536		case RV3028_BACKUP_BSM_DSM:
    537			param->uvalue = RTC_BSM_DIRECT;
    538			break;
    539		case RV3028_BACKUP_BSM_LSM:
    540			param->uvalue = RTC_BSM_LEVEL;
    541			break;
    542		default:
    543			param->uvalue = RTC_BSM_DISABLED;
    544		}
    545		break;
    546
    547	default:
    548		return -EINVAL;
    549	}
    550
    551	return 0;
    552}
    553
    554static int rv3028_param_set(struct device *dev, struct rtc_param *param)
    555{
    556	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
    557
    558	switch(param->param) {
    559		u8 mode;
    560	case RTC_PARAM_BACKUP_SWITCH_MODE:
    561		switch (param->uvalue) {
    562		case RTC_BSM_DISABLED:
    563			mode = 0;
    564			break;
    565		case RTC_BSM_DIRECT:
    566			mode = RV3028_BACKUP_BSM_DSM;
    567			break;
    568		case RTC_BSM_LEVEL:
    569			mode = RV3028_BACKUP_BSM_LSM;
    570			break;
    571		default:
    572			return -EINVAL;
    573		}
    574
    575		return rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_BSM,
    576					 FIELD_PREP(RV3028_BACKUP_BSM, mode));
    577
    578	default:
    579		return -EINVAL;
    580	}
    581
    582	return 0;
    583}
    584
    585static int rv3028_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
    586{
    587	struct rv3028_data *rv3028 = dev_get_drvdata(dev);
    588	int status, ret = 0;
    589
    590	switch (cmd) {
    591	case RTC_VL_READ:
    592		ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status);
    593		if (ret < 0)
    594			return ret;
    595
    596		status = status & RV3028_STATUS_PORF ? RTC_VL_DATA_INVALID : 0;
    597		return put_user(status, (unsigned int __user *)arg);
    598
    599	default:
    600		return -ENOIOCTLCMD;
    601	}
    602}
    603
    604static int rv3028_nvram_write(void *priv, unsigned int offset, void *val,
    605			      size_t bytes)
    606{
    607	return regmap_bulk_write(priv, RV3028_RAM1 + offset, val, bytes);
    608}
    609
    610static int rv3028_nvram_read(void *priv, unsigned int offset, void *val,
    611			     size_t bytes)
    612{
    613	return regmap_bulk_read(priv, RV3028_RAM1 + offset, val, bytes);
    614}
    615
    616static int rv3028_eeprom_write(void *priv, unsigned int offset, void *val,
    617			       size_t bytes)
    618{
    619	struct rv3028_data *rv3028 = priv;
    620	u32 status, eerd;
    621	int i, ret;
    622	u8 *buf = val;
    623
    624	ret = rv3028_enter_eerd(rv3028, &eerd);
    625	if (ret)
    626		return ret;
    627
    628	for (i = 0; i < bytes; i++) {
    629		ret = regmap_write(rv3028->regmap, RV3028_EEPROM_ADDR, offset + i);
    630		if (ret)
    631			goto restore_eerd;
    632
    633		ret = regmap_write(rv3028->regmap, RV3028_EEPROM_DATA, buf[i]);
    634		if (ret)
    635			goto restore_eerd;
    636
    637		ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0);
    638		if (ret)
    639			goto restore_eerd;
    640
    641		ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD,
    642				   RV3028_EEPROM_CMD_WRITE);
    643		if (ret)
    644			goto restore_eerd;
    645
    646		usleep_range(RV3028_EEBUSY_POLL, RV3028_EEBUSY_TIMEOUT);
    647
    648		ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status,
    649					       !(status & RV3028_STATUS_EEBUSY),
    650					       RV3028_EEBUSY_POLL,
    651					       RV3028_EEBUSY_TIMEOUT);
    652		if (ret)
    653			goto restore_eerd;
    654	}
    655
    656restore_eerd:
    657	rv3028_exit_eerd(rv3028, eerd);
    658
    659	return ret;
    660}
    661
    662static int rv3028_eeprom_read(void *priv, unsigned int offset, void *val,
    663			      size_t bytes)
    664{
    665	struct rv3028_data *rv3028 = priv;
    666	u32 status, eerd, data;
    667	int i, ret;
    668	u8 *buf = val;
    669
    670	ret = rv3028_enter_eerd(rv3028, &eerd);
    671	if (ret)
    672		return ret;
    673
    674	for (i = 0; i < bytes; i++) {
    675		ret = regmap_write(rv3028->regmap, RV3028_EEPROM_ADDR, offset + i);
    676		if (ret)
    677			goto restore_eerd;
    678
    679		ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD, 0x0);
    680		if (ret)
    681			goto restore_eerd;
    682
    683		ret = regmap_write(rv3028->regmap, RV3028_EEPROM_CMD,
    684				   RV3028_EEPROM_CMD_READ);
    685		if (ret)
    686			goto restore_eerd;
    687
    688		ret = regmap_read_poll_timeout(rv3028->regmap, RV3028_STATUS, status,
    689					       !(status & RV3028_STATUS_EEBUSY),
    690					       RV3028_EEBUSY_POLL,
    691					       RV3028_EEBUSY_TIMEOUT);
    692		if (ret)
    693			goto restore_eerd;
    694
    695		ret = regmap_read(rv3028->regmap, RV3028_EEPROM_DATA, &data);
    696		if (ret)
    697			goto restore_eerd;
    698		buf[i] = data;
    699	}
    700
    701restore_eerd:
    702	rv3028_exit_eerd(rv3028, eerd);
    703
    704	return ret;
    705}
    706
    707#ifdef CONFIG_COMMON_CLK
    708#define clkout_hw_to_rv3028(hw) container_of(hw, struct rv3028_data, clkout_hw)
    709
    710static int clkout_rates[] = {
    711	32768,
    712	8192,
    713	1024,
    714	64,
    715	32,
    716	1,
    717};
    718
    719static unsigned long rv3028_clkout_recalc_rate(struct clk_hw *hw,
    720					       unsigned long parent_rate)
    721{
    722	int clkout, ret;
    723	struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw);
    724
    725	ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &clkout);
    726	if (ret < 0)
    727		return 0;
    728
    729	clkout &= RV3028_CLKOUT_FD_MASK;
    730	return clkout_rates[clkout];
    731}
    732
    733static long rv3028_clkout_round_rate(struct clk_hw *hw, unsigned long rate,
    734				     unsigned long *prate)
    735{
    736	int i;
    737
    738	for (i = 0; i < ARRAY_SIZE(clkout_rates); i++)
    739		if (clkout_rates[i] <= rate)
    740			return clkout_rates[i];
    741
    742	return 0;
    743}
    744
    745static int rv3028_clkout_set_rate(struct clk_hw *hw, unsigned long rate,
    746				  unsigned long parent_rate)
    747{
    748	int i, ret;
    749	u32 enabled;
    750	struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw);
    751
    752	ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &enabled);
    753	if (ret < 0)
    754		return ret;
    755
    756	ret = regmap_write(rv3028->regmap, RV3028_CLKOUT, 0x0);
    757	if (ret < 0)
    758		return ret;
    759
    760	enabled &= RV3028_CLKOUT_CLKOE;
    761
    762	for (i = 0; i < ARRAY_SIZE(clkout_rates); i++)
    763		if (clkout_rates[i] == rate)
    764			return rv3028_update_cfg(rv3028, RV3028_CLKOUT, 0xff,
    765						 RV3028_CLKOUT_CLKSY | enabled | i);
    766
    767	return -EINVAL;
    768}
    769
    770static int rv3028_clkout_prepare(struct clk_hw *hw)
    771{
    772	struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw);
    773
    774	return regmap_write(rv3028->regmap, RV3028_CLKOUT,
    775			    RV3028_CLKOUT_CLKSY | RV3028_CLKOUT_CLKOE);
    776}
    777
    778static void rv3028_clkout_unprepare(struct clk_hw *hw)
    779{
    780	struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw);
    781
    782	regmap_write(rv3028->regmap, RV3028_CLKOUT, 0x0);
    783	regmap_update_bits(rv3028->regmap, RV3028_STATUS,
    784			   RV3028_STATUS_CLKF, 0);
    785}
    786
    787static int rv3028_clkout_is_prepared(struct clk_hw *hw)
    788{
    789	int clkout, ret;
    790	struct rv3028_data *rv3028 = clkout_hw_to_rv3028(hw);
    791
    792	ret = regmap_read(rv3028->regmap, RV3028_CLKOUT, &clkout);
    793	if (ret < 0)
    794		return ret;
    795
    796	return !!(clkout & RV3028_CLKOUT_CLKOE);
    797}
    798
    799static const struct clk_ops rv3028_clkout_ops = {
    800	.prepare = rv3028_clkout_prepare,
    801	.unprepare = rv3028_clkout_unprepare,
    802	.is_prepared = rv3028_clkout_is_prepared,
    803	.recalc_rate = rv3028_clkout_recalc_rate,
    804	.round_rate = rv3028_clkout_round_rate,
    805	.set_rate = rv3028_clkout_set_rate,
    806};
    807
    808static int rv3028_clkout_register_clk(struct rv3028_data *rv3028,
    809				      struct i2c_client *client)
    810{
    811	int ret;
    812	struct clk *clk;
    813	struct clk_init_data init;
    814	struct device_node *node = client->dev.of_node;
    815
    816	ret = regmap_update_bits(rv3028->regmap, RV3028_STATUS,
    817				 RV3028_STATUS_CLKF, 0);
    818	if (ret < 0)
    819		return ret;
    820
    821	init.name = "rv3028-clkout";
    822	init.ops = &rv3028_clkout_ops;
    823	init.flags = 0;
    824	init.parent_names = NULL;
    825	init.num_parents = 0;
    826	rv3028->clkout_hw.init = &init;
    827
    828	/* optional override of the clockname */
    829	of_property_read_string(node, "clock-output-names", &init.name);
    830
    831	/* register the clock */
    832	clk = devm_clk_register(&client->dev, &rv3028->clkout_hw);
    833	if (!IS_ERR(clk))
    834		of_clk_add_provider(node, of_clk_src_simple_get, clk);
    835
    836	return 0;
    837}
    838#endif
    839
    840static const struct rtc_class_ops rv3028_rtc_ops = {
    841	.read_time = rv3028_get_time,
    842	.set_time = rv3028_set_time,
    843	.read_alarm = rv3028_get_alarm,
    844	.set_alarm = rv3028_set_alarm,
    845	.alarm_irq_enable = rv3028_alarm_irq_enable,
    846	.read_offset = rv3028_read_offset,
    847	.set_offset = rv3028_set_offset,
    848	.ioctl = rv3028_ioctl,
    849	.param_get = rv3028_param_get,
    850	.param_set = rv3028_param_set,
    851};
    852
    853static const struct regmap_config regmap_config = {
    854        .reg_bits = 8,
    855        .val_bits = 8,
    856        .max_register = 0x37,
    857};
    858
    859static int rv3028_probe(struct i2c_client *client)
    860{
    861	struct rv3028_data *rv3028;
    862	int ret, status;
    863	u32 ohms;
    864	struct nvmem_config nvmem_cfg = {
    865		.name = "rv3028_nvram",
    866		.word_size = 1,
    867		.stride = 1,
    868		.size = 2,
    869		.type = NVMEM_TYPE_BATTERY_BACKED,
    870		.reg_read = rv3028_nvram_read,
    871		.reg_write = rv3028_nvram_write,
    872	};
    873	struct nvmem_config eeprom_cfg = {
    874		.name = "rv3028_eeprom",
    875		.word_size = 1,
    876		.stride = 1,
    877		.size = 43,
    878		.type = NVMEM_TYPE_EEPROM,
    879		.reg_read = rv3028_eeprom_read,
    880		.reg_write = rv3028_eeprom_write,
    881	};
    882
    883	rv3028 = devm_kzalloc(&client->dev, sizeof(struct rv3028_data),
    884			      GFP_KERNEL);
    885	if (!rv3028)
    886		return -ENOMEM;
    887
    888	rv3028->regmap = devm_regmap_init_i2c(client, &regmap_config);
    889	if (IS_ERR(rv3028->regmap))
    890		return PTR_ERR(rv3028->regmap);
    891
    892	i2c_set_clientdata(client, rv3028);
    893
    894	ret = regmap_read(rv3028->regmap, RV3028_STATUS, &status);
    895	if (ret < 0)
    896		return ret;
    897
    898	if (status & RV3028_STATUS_AF)
    899		dev_warn(&client->dev, "An alarm may have been missed.\n");
    900
    901	rv3028->rtc = devm_rtc_allocate_device(&client->dev);
    902	if (IS_ERR(rv3028->rtc))
    903		return PTR_ERR(rv3028->rtc);
    904
    905	if (client->irq > 0) {
    906		ret = devm_request_threaded_irq(&client->dev, client->irq,
    907						NULL, rv3028_handle_irq,
    908						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
    909						"rv3028", rv3028);
    910		if (ret) {
    911			dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
    912			client->irq = 0;
    913		}
    914	}
    915	if (!client->irq)
    916		clear_bit(RTC_FEATURE_ALARM, rv3028->rtc->features);
    917
    918	ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL1,
    919				 RV3028_CTRL1_WADA, RV3028_CTRL1_WADA);
    920	if (ret)
    921		return ret;
    922
    923	/* setup timestamping */
    924	ret = regmap_update_bits(rv3028->regmap, RV3028_CTRL2,
    925				 RV3028_CTRL2_EIE | RV3028_CTRL2_TSE,
    926				 RV3028_CTRL2_EIE | RV3028_CTRL2_TSE);
    927	if (ret)
    928		return ret;
    929
    930	/* setup trickle charger */
    931	if (!device_property_read_u32(&client->dev, "trickle-resistor-ohms",
    932				      &ohms)) {
    933		int i;
    934
    935		for (i = 0; i < ARRAY_SIZE(rv3028_trickle_resistors); i++)
    936			if (ohms == rv3028_trickle_resistors[i])
    937				break;
    938
    939		if (i < ARRAY_SIZE(rv3028_trickle_resistors)) {
    940			ret = rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_TCE |
    941						 RV3028_BACKUP_TCR_MASK, RV3028_BACKUP_TCE | i);
    942			if (ret)
    943				return ret;
    944		} else {
    945			dev_warn(&client->dev, "invalid trickle resistor value\n");
    946		}
    947	}
    948
    949	ret = rtc_add_group(rv3028->rtc, &rv3028_attr_group);
    950	if (ret)
    951		return ret;
    952
    953	set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3028->rtc->features);
    954
    955	rv3028->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
    956	rv3028->rtc->range_max = RTC_TIMESTAMP_END_2099;
    957	rv3028->rtc->ops = &rv3028_rtc_ops;
    958	ret = devm_rtc_register_device(rv3028->rtc);
    959	if (ret)
    960		return ret;
    961
    962	nvmem_cfg.priv = rv3028->regmap;
    963	devm_rtc_nvmem_register(rv3028->rtc, &nvmem_cfg);
    964	eeprom_cfg.priv = rv3028;
    965	devm_rtc_nvmem_register(rv3028->rtc, &eeprom_cfg);
    966
    967	rv3028->rtc->max_user_freq = 1;
    968
    969#ifdef CONFIG_COMMON_CLK
    970	rv3028_clkout_register_clk(rv3028, client);
    971#endif
    972	return 0;
    973}
    974
    975static const __maybe_unused struct of_device_id rv3028_of_match[] = {
    976	{ .compatible = "microcrystal,rv3028", },
    977	{ }
    978};
    979MODULE_DEVICE_TABLE(of, rv3028_of_match);
    980
    981static struct i2c_driver rv3028_driver = {
    982	.driver = {
    983		.name = "rtc-rv3028",
    984		.of_match_table = of_match_ptr(rv3028_of_match),
    985	},
    986	.probe_new	= rv3028_probe,
    987};
    988module_i2c_driver(rv3028_driver);
    989
    990MODULE_AUTHOR("Alexandre Belloni <alexandre.belloni@bootlin.com>");
    991MODULE_DESCRIPTION("Micro Crystal RV3028 RTC driver");
    992MODULE_LICENSE("GPL v2");