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-rv3032.c (23913B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * RTC driver for the Micro Crystal RV3032
      4 *
      5 * Copyright (C) 2020 Micro Crystal SA
      6 *
      7 * Alexandre Belloni <alexandre.belloni@bootlin.com>
      8 *
      9 */
     10
     11#include <linux/clk.h>
     12#include <linux/clk-provider.h>
     13#include <linux/bcd.h>
     14#include <linux/bitfield.h>
     15#include <linux/bitops.h>
     16#include <linux/hwmon.h>
     17#include <linux/i2c.h>
     18#include <linux/interrupt.h>
     19#include <linux/kernel.h>
     20#include <linux/log2.h>
     21#include <linux/module.h>
     22#include <linux/of_device.h>
     23#include <linux/regmap.h>
     24#include <linux/rtc.h>
     25
     26#define RV3032_SEC			0x01
     27#define RV3032_MIN			0x02
     28#define RV3032_HOUR			0x03
     29#define RV3032_WDAY			0x04
     30#define RV3032_DAY			0x05
     31#define RV3032_MONTH			0x06
     32#define RV3032_YEAR			0x07
     33#define RV3032_ALARM_MIN		0x08
     34#define RV3032_ALARM_HOUR		0x09
     35#define RV3032_ALARM_DAY		0x0A
     36#define RV3032_STATUS			0x0D
     37#define RV3032_TLSB			0x0E
     38#define RV3032_TMSB			0x0F
     39#define RV3032_CTRL1			0x10
     40#define RV3032_CTRL2			0x11
     41#define RV3032_CTRL3			0x12
     42#define RV3032_TS_CTRL			0x13
     43#define RV3032_CLK_IRQ			0x14
     44#define RV3032_EEPROM_ADDR		0x3D
     45#define RV3032_EEPROM_DATA		0x3E
     46#define RV3032_EEPROM_CMD		0x3F
     47#define RV3032_RAM1			0x40
     48#define RV3032_PMU			0xC0
     49#define RV3032_OFFSET			0xC1
     50#define RV3032_CLKOUT1			0xC2
     51#define RV3032_CLKOUT2			0xC3
     52#define RV3032_TREF0			0xC4
     53#define RV3032_TREF1			0xC5
     54
     55#define RV3032_STATUS_VLF		BIT(0)
     56#define RV3032_STATUS_PORF		BIT(1)
     57#define RV3032_STATUS_EVF		BIT(2)
     58#define RV3032_STATUS_AF		BIT(3)
     59#define RV3032_STATUS_TF		BIT(4)
     60#define RV3032_STATUS_UF		BIT(5)
     61#define RV3032_STATUS_TLF		BIT(6)
     62#define RV3032_STATUS_THF		BIT(7)
     63
     64#define RV3032_TLSB_CLKF		BIT(1)
     65#define RV3032_TLSB_EEBUSY		BIT(2)
     66#define RV3032_TLSB_TEMP		GENMASK(7, 4)
     67
     68#define RV3032_CLKOUT2_HFD_MSK		GENMASK(4, 0)
     69#define RV3032_CLKOUT2_FD_MSK		GENMASK(6, 5)
     70#define RV3032_CLKOUT2_OS		BIT(7)
     71
     72#define RV3032_CTRL1_EERD		BIT(3)
     73#define RV3032_CTRL1_WADA		BIT(5)
     74
     75#define RV3032_CTRL2_STOP		BIT(0)
     76#define RV3032_CTRL2_EIE		BIT(2)
     77#define RV3032_CTRL2_AIE		BIT(3)
     78#define RV3032_CTRL2_TIE		BIT(4)
     79#define RV3032_CTRL2_UIE		BIT(5)
     80#define RV3032_CTRL2_CLKIE		BIT(6)
     81#define RV3032_CTRL2_TSE		BIT(7)
     82
     83#define RV3032_PMU_TCM			GENMASK(1, 0)
     84#define RV3032_PMU_TCR			GENMASK(3, 2)
     85#define RV3032_PMU_BSM			GENMASK(5, 4)
     86#define RV3032_PMU_NCLKE		BIT(6)
     87
     88#define RV3032_PMU_BSM_DSM		1
     89#define RV3032_PMU_BSM_LSM		2
     90
     91#define RV3032_OFFSET_MSK		GENMASK(5, 0)
     92
     93#define RV3032_EVT_CTRL_TSR		BIT(2)
     94
     95#define RV3032_EEPROM_CMD_UPDATE	0x11
     96#define RV3032_EEPROM_CMD_WRITE		0x21
     97#define RV3032_EEPROM_CMD_READ		0x22
     98
     99#define RV3032_EEPROM_USER		0xCB
    100
    101#define RV3032_EEBUSY_POLL		10000
    102#define RV3032_EEBUSY_TIMEOUT		100000
    103
    104#define OFFSET_STEP_PPT			238419
    105
    106struct rv3032_data {
    107	struct regmap *regmap;
    108	struct rtc_device *rtc;
    109	bool trickle_charger_set;
    110#ifdef CONFIG_COMMON_CLK
    111	struct clk_hw clkout_hw;
    112#endif
    113};
    114
    115static u16 rv3032_trickle_resistors[] = {1000, 2000, 7000, 11000};
    116static u16 rv3032_trickle_voltages[] = {0, 1750, 3000, 4400};
    117
    118static int rv3032_exit_eerd(struct rv3032_data *rv3032, u32 eerd)
    119{
    120	if (eerd)
    121		return 0;
    122
    123	return regmap_update_bits(rv3032->regmap, RV3032_CTRL1, RV3032_CTRL1_EERD, 0);
    124}
    125
    126static int rv3032_enter_eerd(struct rv3032_data *rv3032, u32 *eerd)
    127{
    128	u32 ctrl1, status;
    129	int ret;
    130
    131	ret = regmap_read(rv3032->regmap, RV3032_CTRL1, &ctrl1);
    132	if (ret)
    133		return ret;
    134
    135	*eerd = ctrl1 & RV3032_CTRL1_EERD;
    136	if (*eerd)
    137		return 0;
    138
    139	ret = regmap_update_bits(rv3032->regmap, RV3032_CTRL1,
    140				 RV3032_CTRL1_EERD, RV3032_CTRL1_EERD);
    141	if (ret)
    142		return ret;
    143
    144	ret = regmap_read_poll_timeout(rv3032->regmap, RV3032_TLSB, status,
    145				       !(status & RV3032_TLSB_EEBUSY),
    146				       RV3032_EEBUSY_POLL, RV3032_EEBUSY_TIMEOUT);
    147	if (ret) {
    148		rv3032_exit_eerd(rv3032, *eerd);
    149
    150		return ret;
    151	}
    152
    153	return 0;
    154}
    155
    156static int rv3032_update_cfg(struct rv3032_data *rv3032, unsigned int reg,
    157			     unsigned int mask, unsigned int val)
    158{
    159	u32 status, eerd;
    160	int ret;
    161
    162	ret = rv3032_enter_eerd(rv3032, &eerd);
    163	if (ret)
    164		return ret;
    165
    166	ret = regmap_update_bits(rv3032->regmap, reg, mask, val);
    167	if (ret)
    168		goto exit_eerd;
    169
    170	ret = regmap_write(rv3032->regmap, RV3032_EEPROM_CMD, RV3032_EEPROM_CMD_UPDATE);
    171	if (ret)
    172		goto exit_eerd;
    173
    174	usleep_range(46000, RV3032_EEBUSY_TIMEOUT);
    175
    176	ret = regmap_read_poll_timeout(rv3032->regmap, RV3032_TLSB, status,
    177				       !(status & RV3032_TLSB_EEBUSY),
    178				       RV3032_EEBUSY_POLL, RV3032_EEBUSY_TIMEOUT);
    179
    180exit_eerd:
    181	rv3032_exit_eerd(rv3032, eerd);
    182
    183	return ret;
    184}
    185
    186static irqreturn_t rv3032_handle_irq(int irq, void *dev_id)
    187{
    188	struct rv3032_data *rv3032 = dev_id;
    189	unsigned long events = 0;
    190	u32 status = 0, ctrl = 0;
    191
    192	if (regmap_read(rv3032->regmap, RV3032_STATUS, &status) < 0 ||
    193	    status == 0) {
    194		return IRQ_NONE;
    195	}
    196
    197	if (status & RV3032_STATUS_TF) {
    198		status |= RV3032_STATUS_TF;
    199		ctrl |= RV3032_CTRL2_TIE;
    200		events |= RTC_PF;
    201	}
    202
    203	if (status & RV3032_STATUS_AF) {
    204		status |= RV3032_STATUS_AF;
    205		ctrl |= RV3032_CTRL2_AIE;
    206		events |= RTC_AF;
    207	}
    208
    209	if (status & RV3032_STATUS_UF) {
    210		status |= RV3032_STATUS_UF;
    211		ctrl |= RV3032_CTRL2_UIE;
    212		events |= RTC_UF;
    213	}
    214
    215	if (events) {
    216		rtc_update_irq(rv3032->rtc, 1, events);
    217		regmap_update_bits(rv3032->regmap, RV3032_STATUS, status, 0);
    218		regmap_update_bits(rv3032->regmap, RV3032_CTRL2, ctrl, 0);
    219	}
    220
    221	return IRQ_HANDLED;
    222}
    223
    224static int rv3032_get_time(struct device *dev, struct rtc_time *tm)
    225{
    226	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    227	u8 date[7];
    228	int ret, status;
    229
    230	ret = regmap_read(rv3032->regmap, RV3032_STATUS, &status);
    231	if (ret < 0)
    232		return ret;
    233
    234	if (status & (RV3032_STATUS_PORF | RV3032_STATUS_VLF))
    235		return -EINVAL;
    236
    237	ret = regmap_bulk_read(rv3032->regmap, RV3032_SEC, date, sizeof(date));
    238	if (ret)
    239		return ret;
    240
    241	tm->tm_sec  = bcd2bin(date[0] & 0x7f);
    242	tm->tm_min  = bcd2bin(date[1] & 0x7f);
    243	tm->tm_hour = bcd2bin(date[2] & 0x3f);
    244	tm->tm_wday = date[3] & 0x7;
    245	tm->tm_mday = bcd2bin(date[4] & 0x3f);
    246	tm->tm_mon  = bcd2bin(date[5] & 0x1f) - 1;
    247	tm->tm_year = bcd2bin(date[6]) + 100;
    248
    249	return 0;
    250}
    251
    252static int rv3032_set_time(struct device *dev, struct rtc_time *tm)
    253{
    254	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    255	u8 date[7];
    256	int ret;
    257
    258	date[0] = bin2bcd(tm->tm_sec);
    259	date[1] = bin2bcd(tm->tm_min);
    260	date[2] = bin2bcd(tm->tm_hour);
    261	date[3] = tm->tm_wday;
    262	date[4] = bin2bcd(tm->tm_mday);
    263	date[5] = bin2bcd(tm->tm_mon + 1);
    264	date[6] = bin2bcd(tm->tm_year - 100);
    265
    266	ret = regmap_bulk_write(rv3032->regmap, RV3032_SEC, date,
    267				sizeof(date));
    268	if (ret)
    269		return ret;
    270
    271	ret = regmap_update_bits(rv3032->regmap, RV3032_STATUS,
    272				 RV3032_STATUS_PORF | RV3032_STATUS_VLF, 0);
    273
    274	return ret;
    275}
    276
    277static int rv3032_get_alarm(struct device *dev, struct rtc_wkalrm *alrm)
    278{
    279	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    280	u8 alarmvals[3];
    281	int status, ctrl, ret;
    282
    283	ret = regmap_bulk_read(rv3032->regmap, RV3032_ALARM_MIN, alarmvals,
    284			       sizeof(alarmvals));
    285	if (ret)
    286		return ret;
    287
    288	ret = regmap_read(rv3032->regmap, RV3032_STATUS, &status);
    289	if (ret < 0)
    290		return ret;
    291
    292	ret = regmap_read(rv3032->regmap, RV3032_CTRL2, &ctrl);
    293	if (ret < 0)
    294		return ret;
    295
    296	alrm->time.tm_sec  = 0;
    297	alrm->time.tm_min  = bcd2bin(alarmvals[0] & 0x7f);
    298	alrm->time.tm_hour = bcd2bin(alarmvals[1] & 0x3f);
    299	alrm->time.tm_mday = bcd2bin(alarmvals[2] & 0x3f);
    300
    301	alrm->enabled = !!(ctrl & RV3032_CTRL2_AIE);
    302	alrm->pending = (status & RV3032_STATUS_AF) && alrm->enabled;
    303
    304	return 0;
    305}
    306
    307static int rv3032_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
    308{
    309	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    310	u8 alarmvals[3];
    311	u8 ctrl = 0;
    312	int ret;
    313
    314	ret = regmap_update_bits(rv3032->regmap, RV3032_CTRL2,
    315				 RV3032_CTRL2_AIE | RV3032_CTRL2_UIE, 0);
    316	if (ret)
    317		return ret;
    318
    319	alarmvals[0] = bin2bcd(alrm->time.tm_min);
    320	alarmvals[1] = bin2bcd(alrm->time.tm_hour);
    321	alarmvals[2] = bin2bcd(alrm->time.tm_mday);
    322
    323	ret = regmap_update_bits(rv3032->regmap, RV3032_STATUS,
    324				 RV3032_STATUS_AF, 0);
    325	if (ret)
    326		return ret;
    327
    328	ret = regmap_bulk_write(rv3032->regmap, RV3032_ALARM_MIN, alarmvals,
    329				sizeof(alarmvals));
    330	if (ret)
    331		return ret;
    332
    333	if (alrm->enabled) {
    334		if (rv3032->rtc->uie_rtctimer.enabled)
    335			ctrl |= RV3032_CTRL2_UIE;
    336		if (rv3032->rtc->aie_timer.enabled)
    337			ctrl |= RV3032_CTRL2_AIE;
    338	}
    339
    340	ret = regmap_update_bits(rv3032->regmap, RV3032_CTRL2,
    341				 RV3032_CTRL2_UIE | RV3032_CTRL2_AIE, ctrl);
    342
    343	return ret;
    344}
    345
    346static int rv3032_alarm_irq_enable(struct device *dev, unsigned int enabled)
    347{
    348	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    349	int ctrl = 0, ret;
    350
    351	if (enabled) {
    352		if (rv3032->rtc->uie_rtctimer.enabled)
    353			ctrl |= RV3032_CTRL2_UIE;
    354		if (rv3032->rtc->aie_timer.enabled)
    355			ctrl |= RV3032_CTRL2_AIE;
    356	}
    357
    358	ret = regmap_update_bits(rv3032->regmap, RV3032_STATUS,
    359				 RV3032_STATUS_AF | RV3032_STATUS_UF, 0);
    360	if (ret)
    361		return ret;
    362
    363	ret = regmap_update_bits(rv3032->regmap, RV3032_CTRL2,
    364				 RV3032_CTRL2_UIE | RV3032_CTRL2_AIE, ctrl);
    365	if (ret)
    366		return ret;
    367
    368	return 0;
    369}
    370
    371static int rv3032_read_offset(struct device *dev, long *offset)
    372{
    373	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    374	int ret, value, steps;
    375
    376	ret = regmap_read(rv3032->regmap, RV3032_OFFSET, &value);
    377	if (ret < 0)
    378		return ret;
    379
    380	steps = sign_extend32(FIELD_GET(RV3032_OFFSET_MSK, value), 5);
    381
    382	*offset = DIV_ROUND_CLOSEST(steps * OFFSET_STEP_PPT, 1000);
    383
    384	return 0;
    385}
    386
    387static int rv3032_set_offset(struct device *dev, long offset)
    388{
    389	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    390
    391	offset = clamp(offset, -7629L, 7391L) * 1000;
    392	offset = DIV_ROUND_CLOSEST(offset, OFFSET_STEP_PPT);
    393
    394	return rv3032_update_cfg(rv3032, RV3032_OFFSET, RV3032_OFFSET_MSK,
    395				 FIELD_PREP(RV3032_OFFSET_MSK, offset));
    396}
    397
    398static int rv3032_param_get(struct device *dev, struct rtc_param *param)
    399{
    400	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    401	int ret;
    402
    403	switch(param->param) {
    404		u32 value;
    405
    406	case RTC_PARAM_BACKUP_SWITCH_MODE:
    407		ret = regmap_read(rv3032->regmap, RV3032_PMU, &value);
    408		if (ret < 0)
    409			return ret;
    410
    411		value = FIELD_GET(RV3032_PMU_BSM, value);
    412
    413		switch(value) {
    414		case RV3032_PMU_BSM_DSM:
    415			param->uvalue = RTC_BSM_DIRECT;
    416			break;
    417		case RV3032_PMU_BSM_LSM:
    418			param->uvalue = RTC_BSM_LEVEL;
    419			break;
    420		default:
    421			param->uvalue = RTC_BSM_DISABLED;
    422		}
    423
    424		break;
    425
    426	default:
    427		return -EINVAL;
    428	}
    429
    430	return 0;
    431}
    432
    433static int rv3032_param_set(struct device *dev, struct rtc_param *param)
    434{
    435	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    436
    437	switch(param->param) {
    438		u8 mode;
    439	case RTC_PARAM_BACKUP_SWITCH_MODE:
    440		if (rv3032->trickle_charger_set)
    441			return -EINVAL;
    442
    443		switch (param->uvalue) {
    444		case RTC_BSM_DISABLED:
    445			mode = 0;
    446			break;
    447		case RTC_BSM_DIRECT:
    448			mode = RV3032_PMU_BSM_DSM;
    449			break;
    450		case RTC_BSM_LEVEL:
    451			mode = RV3032_PMU_BSM_LSM;
    452			break;
    453		default:
    454			return -EINVAL;
    455		}
    456
    457		return rv3032_update_cfg(rv3032, RV3032_PMU, RV3032_PMU_BSM,
    458					 FIELD_PREP(RV3032_PMU_BSM, mode));
    459
    460	default:
    461		return -EINVAL;
    462	}
    463
    464	return 0;
    465}
    466
    467static int rv3032_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
    468{
    469	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    470	int status, val = 0, ret = 0;
    471
    472	switch (cmd) {
    473	case RTC_VL_READ:
    474		ret = regmap_read(rv3032->regmap, RV3032_STATUS, &status);
    475		if (ret < 0)
    476			return ret;
    477
    478		if (status & (RV3032_STATUS_PORF | RV3032_STATUS_VLF))
    479			val = RTC_VL_DATA_INVALID;
    480		return put_user(val, (unsigned int __user *)arg);
    481
    482	default:
    483		return -ENOIOCTLCMD;
    484	}
    485}
    486
    487static int rv3032_nvram_write(void *priv, unsigned int offset, void *val, size_t bytes)
    488{
    489	return regmap_bulk_write(priv, RV3032_RAM1 + offset, val, bytes);
    490}
    491
    492static int rv3032_nvram_read(void *priv, unsigned int offset, void *val, size_t bytes)
    493{
    494	return regmap_bulk_read(priv, RV3032_RAM1 + offset, val, bytes);
    495}
    496
    497static int rv3032_eeprom_write(void *priv, unsigned int offset, void *val, size_t bytes)
    498{
    499	struct rv3032_data *rv3032 = priv;
    500	u32 status, eerd;
    501	int i, ret;
    502	u8 *buf = val;
    503
    504	ret = rv3032_enter_eerd(rv3032, &eerd);
    505	if (ret)
    506		return ret;
    507
    508	for (i = 0; i < bytes; i++) {
    509		ret = regmap_write(rv3032->regmap, RV3032_EEPROM_ADDR,
    510				   RV3032_EEPROM_USER + offset + i);
    511		if (ret)
    512			goto exit_eerd;
    513
    514		ret = regmap_write(rv3032->regmap, RV3032_EEPROM_DATA, buf[i]);
    515		if (ret)
    516			goto exit_eerd;
    517
    518		ret = regmap_write(rv3032->regmap, RV3032_EEPROM_CMD,
    519				   RV3032_EEPROM_CMD_WRITE);
    520		if (ret)
    521			goto exit_eerd;
    522
    523		usleep_range(RV3032_EEBUSY_POLL, RV3032_EEBUSY_TIMEOUT);
    524
    525		ret = regmap_read_poll_timeout(rv3032->regmap, RV3032_TLSB, status,
    526					       !(status & RV3032_TLSB_EEBUSY),
    527					       RV3032_EEBUSY_POLL, RV3032_EEBUSY_TIMEOUT);
    528		if (ret)
    529			goto exit_eerd;
    530	}
    531
    532exit_eerd:
    533	rv3032_exit_eerd(rv3032, eerd);
    534
    535	return ret;
    536}
    537
    538static int rv3032_eeprom_read(void *priv, unsigned int offset, void *val, size_t bytes)
    539{
    540	struct rv3032_data *rv3032 = priv;
    541	u32 status, eerd, data;
    542	int i, ret;
    543	u8 *buf = val;
    544
    545	ret = rv3032_enter_eerd(rv3032, &eerd);
    546	if (ret)
    547		return ret;
    548
    549	for (i = 0; i < bytes; i++) {
    550		ret = regmap_write(rv3032->regmap, RV3032_EEPROM_ADDR,
    551				   RV3032_EEPROM_USER + offset + i);
    552		if (ret)
    553			goto exit_eerd;
    554
    555		ret = regmap_write(rv3032->regmap, RV3032_EEPROM_CMD,
    556				   RV3032_EEPROM_CMD_READ);
    557		if (ret)
    558			goto exit_eerd;
    559
    560		ret = regmap_read_poll_timeout(rv3032->regmap, RV3032_TLSB, status,
    561					       !(status & RV3032_TLSB_EEBUSY),
    562					       RV3032_EEBUSY_POLL, RV3032_EEBUSY_TIMEOUT);
    563		if (ret)
    564			goto exit_eerd;
    565
    566		ret = regmap_read(rv3032->regmap, RV3032_EEPROM_DATA, &data);
    567		if (ret)
    568			goto exit_eerd;
    569		buf[i] = data;
    570	}
    571
    572exit_eerd:
    573	rv3032_exit_eerd(rv3032, eerd);
    574
    575	return ret;
    576}
    577
    578static int rv3032_trickle_charger_setup(struct device *dev, struct rv3032_data *rv3032)
    579{
    580	u32 val, ohms, voltage;
    581	int i;
    582
    583	val = FIELD_PREP(RV3032_PMU_TCM, 1) | FIELD_PREP(RV3032_PMU_BSM, RV3032_PMU_BSM_DSM);
    584	if (!device_property_read_u32(dev, "trickle-voltage-millivolt", &voltage)) {
    585		for (i = 0; i < ARRAY_SIZE(rv3032_trickle_voltages); i++)
    586			if (voltage == rv3032_trickle_voltages[i])
    587				break;
    588		if (i < ARRAY_SIZE(rv3032_trickle_voltages))
    589			val = FIELD_PREP(RV3032_PMU_TCM, i) |
    590			      FIELD_PREP(RV3032_PMU_BSM, RV3032_PMU_BSM_LSM);
    591	}
    592
    593	if (device_property_read_u32(dev, "trickle-resistor-ohms", &ohms))
    594		return 0;
    595
    596	for (i = 0; i < ARRAY_SIZE(rv3032_trickle_resistors); i++)
    597		if (ohms == rv3032_trickle_resistors[i])
    598			break;
    599
    600	if (i >= ARRAY_SIZE(rv3032_trickle_resistors)) {
    601		dev_warn(dev, "invalid trickle resistor value\n");
    602
    603		return 0;
    604	}
    605
    606	rv3032->trickle_charger_set = true;
    607
    608	return rv3032_update_cfg(rv3032, RV3032_PMU,
    609				 RV3032_PMU_TCR | RV3032_PMU_TCM | RV3032_PMU_BSM,
    610				 val | FIELD_PREP(RV3032_PMU_TCR, i));
    611}
    612
    613#ifdef CONFIG_COMMON_CLK
    614#define clkout_hw_to_rv3032(hw) container_of(hw, struct rv3032_data, clkout_hw)
    615
    616static int clkout_xtal_rates[] = {
    617	32768,
    618	1024,
    619	64,
    620	1,
    621};
    622
    623#define RV3032_HFD_STEP 8192
    624
    625static unsigned long rv3032_clkout_recalc_rate(struct clk_hw *hw,
    626					       unsigned long parent_rate)
    627{
    628	int clkout, ret;
    629	struct rv3032_data *rv3032 = clkout_hw_to_rv3032(hw);
    630
    631	ret = regmap_read(rv3032->regmap, RV3032_CLKOUT2, &clkout);
    632	if (ret < 0)
    633		return 0;
    634
    635	if (clkout & RV3032_CLKOUT2_OS) {
    636		unsigned long rate = FIELD_GET(RV3032_CLKOUT2_HFD_MSK, clkout) << 8;
    637
    638		ret = regmap_read(rv3032->regmap, RV3032_CLKOUT1, &clkout);
    639		if (ret < 0)
    640			return 0;
    641
    642		rate += clkout + 1;
    643
    644		return rate * RV3032_HFD_STEP;
    645	}
    646
    647	return clkout_xtal_rates[FIELD_GET(RV3032_CLKOUT2_FD_MSK, clkout)];
    648}
    649
    650static long rv3032_clkout_round_rate(struct clk_hw *hw, unsigned long rate,
    651				     unsigned long *prate)
    652{
    653	int i, hfd;
    654
    655	if (rate < RV3032_HFD_STEP)
    656		for (i = 0; i < ARRAY_SIZE(clkout_xtal_rates); i++)
    657			if (clkout_xtal_rates[i] <= rate)
    658				return clkout_xtal_rates[i];
    659
    660	hfd = DIV_ROUND_CLOSEST(rate, RV3032_HFD_STEP);
    661
    662	return RV3032_HFD_STEP * clamp(hfd, 0, 8192);
    663}
    664
    665static int rv3032_clkout_set_rate(struct clk_hw *hw, unsigned long rate,
    666				  unsigned long parent_rate)
    667{
    668	struct rv3032_data *rv3032 = clkout_hw_to_rv3032(hw);
    669	u32 status, eerd;
    670	int i, hfd, ret;
    671
    672	for (i = 0; i < ARRAY_SIZE(clkout_xtal_rates); i++) {
    673		if (clkout_xtal_rates[i] == rate) {
    674			return rv3032_update_cfg(rv3032, RV3032_CLKOUT2, 0xff,
    675						 FIELD_PREP(RV3032_CLKOUT2_FD_MSK, i));
    676		}
    677	}
    678
    679	hfd = DIV_ROUND_CLOSEST(rate, RV3032_HFD_STEP);
    680	hfd = clamp(hfd, 1, 8192) - 1;
    681
    682	ret = rv3032_enter_eerd(rv3032, &eerd);
    683	if (ret)
    684		return ret;
    685
    686	ret = regmap_write(rv3032->regmap, RV3032_CLKOUT1, hfd & 0xff);
    687	if (ret)
    688		goto exit_eerd;
    689
    690	ret = regmap_write(rv3032->regmap, RV3032_CLKOUT2, RV3032_CLKOUT2_OS |
    691			    FIELD_PREP(RV3032_CLKOUT2_HFD_MSK, hfd >> 8));
    692	if (ret)
    693		goto exit_eerd;
    694
    695	ret = regmap_write(rv3032->regmap, RV3032_EEPROM_CMD, RV3032_EEPROM_CMD_UPDATE);
    696	if (ret)
    697		goto exit_eerd;
    698
    699	usleep_range(46000, RV3032_EEBUSY_TIMEOUT);
    700
    701	ret = regmap_read_poll_timeout(rv3032->regmap, RV3032_TLSB, status,
    702				       !(status & RV3032_TLSB_EEBUSY),
    703				       RV3032_EEBUSY_POLL, RV3032_EEBUSY_TIMEOUT);
    704
    705exit_eerd:
    706	rv3032_exit_eerd(rv3032, eerd);
    707
    708	return ret;
    709}
    710
    711static int rv3032_clkout_prepare(struct clk_hw *hw)
    712{
    713	struct rv3032_data *rv3032 = clkout_hw_to_rv3032(hw);
    714
    715	return rv3032_update_cfg(rv3032, RV3032_PMU, RV3032_PMU_NCLKE, 0);
    716}
    717
    718static void rv3032_clkout_unprepare(struct clk_hw *hw)
    719{
    720	struct rv3032_data *rv3032 = clkout_hw_to_rv3032(hw);
    721
    722	rv3032_update_cfg(rv3032, RV3032_PMU, RV3032_PMU_NCLKE, RV3032_PMU_NCLKE);
    723}
    724
    725static int rv3032_clkout_is_prepared(struct clk_hw *hw)
    726{
    727	int val, ret;
    728	struct rv3032_data *rv3032 = clkout_hw_to_rv3032(hw);
    729
    730	ret = regmap_read(rv3032->regmap, RV3032_PMU, &val);
    731	if (ret < 0)
    732		return ret;
    733
    734	return !(val & RV3032_PMU_NCLKE);
    735}
    736
    737static const struct clk_ops rv3032_clkout_ops = {
    738	.prepare = rv3032_clkout_prepare,
    739	.unprepare = rv3032_clkout_unprepare,
    740	.is_prepared = rv3032_clkout_is_prepared,
    741	.recalc_rate = rv3032_clkout_recalc_rate,
    742	.round_rate = rv3032_clkout_round_rate,
    743	.set_rate = rv3032_clkout_set_rate,
    744};
    745
    746static int rv3032_clkout_register_clk(struct rv3032_data *rv3032,
    747				      struct i2c_client *client)
    748{
    749	int ret;
    750	struct clk *clk;
    751	struct clk_init_data init;
    752	struct device_node *node = client->dev.of_node;
    753
    754	ret = regmap_update_bits(rv3032->regmap, RV3032_TLSB, RV3032_TLSB_CLKF, 0);
    755	if (ret < 0)
    756		return ret;
    757
    758	ret = regmap_update_bits(rv3032->regmap, RV3032_CTRL2, RV3032_CTRL2_CLKIE, 0);
    759	if (ret < 0)
    760		return ret;
    761
    762	ret = regmap_write(rv3032->regmap, RV3032_CLK_IRQ, 0);
    763	if (ret < 0)
    764		return ret;
    765
    766	init.name = "rv3032-clkout";
    767	init.ops = &rv3032_clkout_ops;
    768	init.flags = 0;
    769	init.parent_names = NULL;
    770	init.num_parents = 0;
    771	rv3032->clkout_hw.init = &init;
    772
    773	of_property_read_string(node, "clock-output-names", &init.name);
    774
    775	clk = devm_clk_register(&client->dev, &rv3032->clkout_hw);
    776	if (!IS_ERR(clk))
    777		of_clk_add_provider(node, of_clk_src_simple_get, clk);
    778
    779	return 0;
    780}
    781#endif
    782
    783static int rv3032_hwmon_read_temp(struct device *dev, long *mC)
    784{
    785	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    786	u8 buf[2];
    787	int temp, prev = 0;
    788	int ret;
    789
    790	ret = regmap_bulk_read(rv3032->regmap, RV3032_TLSB, buf, sizeof(buf));
    791	if (ret)
    792		return ret;
    793
    794	temp = sign_extend32(buf[1], 7) << 4;
    795	temp |= FIELD_GET(RV3032_TLSB_TEMP, buf[0]);
    796
    797	/* No blocking or shadowing on RV3032_TLSB and RV3032_TMSB */
    798	do {
    799		prev = temp;
    800
    801		ret = regmap_bulk_read(rv3032->regmap, RV3032_TLSB, buf, sizeof(buf));
    802		if (ret)
    803			return ret;
    804
    805		temp = sign_extend32(buf[1], 7) << 4;
    806		temp |= FIELD_GET(RV3032_TLSB_TEMP, buf[0]);
    807	} while (temp != prev);
    808
    809	*mC = (temp * 1000) / 16;
    810
    811	return 0;
    812}
    813
    814static umode_t rv3032_hwmon_is_visible(const void *data, enum hwmon_sensor_types type,
    815				       u32 attr, int channel)
    816{
    817	if (type != hwmon_temp)
    818		return 0;
    819
    820	switch (attr) {
    821	case hwmon_temp_input:
    822		return 0444;
    823	default:
    824		return 0;
    825	}
    826}
    827
    828static int rv3032_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
    829			     u32 attr, int channel, long *temp)
    830{
    831	int err;
    832
    833	switch (attr) {
    834	case hwmon_temp_input:
    835		err = rv3032_hwmon_read_temp(dev, temp);
    836		break;
    837	default:
    838		err = -EOPNOTSUPP;
    839		break;
    840	}
    841
    842	return err;
    843}
    844
    845static const struct hwmon_channel_info *rv3032_hwmon_info[] = {
    846	HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
    847	HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MAX_HYST),
    848	NULL
    849};
    850
    851static const struct hwmon_ops rv3032_hwmon_hwmon_ops = {
    852	.is_visible = rv3032_hwmon_is_visible,
    853	.read = rv3032_hwmon_read,
    854};
    855
    856static const struct hwmon_chip_info rv3032_hwmon_chip_info = {
    857	.ops = &rv3032_hwmon_hwmon_ops,
    858	.info = rv3032_hwmon_info,
    859};
    860
    861static void rv3032_hwmon_register(struct device *dev)
    862{
    863	struct rv3032_data *rv3032 = dev_get_drvdata(dev);
    864
    865	if (!IS_REACHABLE(CONFIG_HWMON))
    866		return;
    867
    868	devm_hwmon_device_register_with_info(dev, "rv3032", rv3032, &rv3032_hwmon_chip_info, NULL);
    869}
    870
    871static const struct rtc_class_ops rv3032_rtc_ops = {
    872	.read_time = rv3032_get_time,
    873	.set_time = rv3032_set_time,
    874	.read_offset = rv3032_read_offset,
    875	.set_offset = rv3032_set_offset,
    876	.ioctl = rv3032_ioctl,
    877	.read_alarm = rv3032_get_alarm,
    878	.set_alarm = rv3032_set_alarm,
    879	.alarm_irq_enable = rv3032_alarm_irq_enable,
    880	.param_get = rv3032_param_get,
    881	.param_set = rv3032_param_set,
    882};
    883
    884static const struct regmap_config regmap_config = {
    885	.reg_bits = 8,
    886	.val_bits = 8,
    887	.max_register = 0xCA,
    888};
    889
    890static int rv3032_probe(struct i2c_client *client)
    891{
    892	struct rv3032_data *rv3032;
    893	int ret, status;
    894	struct nvmem_config nvmem_cfg = {
    895		.name = "rv3032_nvram",
    896		.word_size = 1,
    897		.stride = 1,
    898		.size = 16,
    899		.type = NVMEM_TYPE_BATTERY_BACKED,
    900		.reg_read = rv3032_nvram_read,
    901		.reg_write = rv3032_nvram_write,
    902	};
    903	struct nvmem_config eeprom_cfg = {
    904		.name = "rv3032_eeprom",
    905		.word_size = 1,
    906		.stride = 1,
    907		.size = 32,
    908		.type = NVMEM_TYPE_EEPROM,
    909		.reg_read = rv3032_eeprom_read,
    910		.reg_write = rv3032_eeprom_write,
    911	};
    912
    913	rv3032 = devm_kzalloc(&client->dev, sizeof(struct rv3032_data),
    914			      GFP_KERNEL);
    915	if (!rv3032)
    916		return -ENOMEM;
    917
    918	rv3032->regmap = devm_regmap_init_i2c(client, &regmap_config);
    919	if (IS_ERR(rv3032->regmap))
    920		return PTR_ERR(rv3032->regmap);
    921
    922	i2c_set_clientdata(client, rv3032);
    923
    924	ret = regmap_read(rv3032->regmap, RV3032_STATUS, &status);
    925	if (ret < 0)
    926		return ret;
    927
    928	rv3032->rtc = devm_rtc_allocate_device(&client->dev);
    929	if (IS_ERR(rv3032->rtc))
    930		return PTR_ERR(rv3032->rtc);
    931
    932	if (client->irq > 0) {
    933		ret = devm_request_threaded_irq(&client->dev, client->irq,
    934						NULL, rv3032_handle_irq,
    935						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
    936						"rv3032", rv3032);
    937		if (ret) {
    938			dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
    939			client->irq = 0;
    940		}
    941	}
    942	if (!client->irq)
    943		clear_bit(RTC_FEATURE_ALARM, rv3032->rtc->features);
    944
    945	ret = regmap_update_bits(rv3032->regmap, RV3032_CTRL1,
    946				 RV3032_CTRL1_WADA, RV3032_CTRL1_WADA);
    947	if (ret)
    948		return ret;
    949
    950	rv3032_trickle_charger_setup(&client->dev, rv3032);
    951
    952	set_bit(RTC_FEATURE_BACKUP_SWITCH_MODE, rv3032->rtc->features);
    953	set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rv3032->rtc->features);
    954
    955	rv3032->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
    956	rv3032->rtc->range_max = RTC_TIMESTAMP_END_2099;
    957	rv3032->rtc->ops = &rv3032_rtc_ops;
    958	ret = devm_rtc_register_device(rv3032->rtc);
    959	if (ret)
    960		return ret;
    961
    962	nvmem_cfg.priv = rv3032->regmap;
    963	devm_rtc_nvmem_register(rv3032->rtc, &nvmem_cfg);
    964	eeprom_cfg.priv = rv3032;
    965	devm_rtc_nvmem_register(rv3032->rtc, &eeprom_cfg);
    966
    967	rv3032->rtc->max_user_freq = 1;
    968
    969#ifdef CONFIG_COMMON_CLK
    970	rv3032_clkout_register_clk(rv3032, client);
    971#endif
    972
    973	rv3032_hwmon_register(&client->dev);
    974
    975	return 0;
    976}
    977
    978static const __maybe_unused struct of_device_id rv3032_of_match[] = {
    979	{ .compatible = "microcrystal,rv3032", },
    980	{ }
    981};
    982MODULE_DEVICE_TABLE(of, rv3032_of_match);
    983
    984static struct i2c_driver rv3032_driver = {
    985	.driver = {
    986		.name = "rtc-rv3032",
    987		.of_match_table = of_match_ptr(rv3032_of_match),
    988	},
    989	.probe_new	= rv3032_probe,
    990};
    991module_i2c_driver(rv3032_driver);
    992
    993MODULE_AUTHOR("Alexandre Belloni <alexandre.belloni@bootlin.com>");
    994MODULE_DESCRIPTION("Micro Crystal RV3032 RTC driver");
    995MODULE_LICENSE("GPL v2");