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-rx8025.c (14454B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Driver for Epson's RTC module RX-8025 SA/NB
      4 *
      5 * Copyright (C) 2009 Wolfgang Grandegger <wg@grandegger.com>
      6 *
      7 * Copyright (C) 2005 by Digi International Inc.
      8 * All rights reserved.
      9 *
     10 * Modified by fengjh at rising.com.cn
     11 * <lm-sensors@lm-sensors.org>
     12 * 2006.11
     13 *
     14 * Code cleanup by Sergei Poselenov, <sposelenov@emcraft.com>
     15 * Converted to new style by Wolfgang Grandegger <wg@grandegger.com>
     16 * Alarm and periodic interrupt added by Dmitry Rakhchev <rda@emcraft.com>
     17 */
     18#include <linux/bcd.h>
     19#include <linux/bitops.h>
     20#include <linux/i2c.h>
     21#include <linux/kernel.h>
     22#include <linux/module.h>
     23#include <linux/rtc.h>
     24
     25/* Register definitions */
     26#define RX8025_REG_SEC		0x00
     27#define RX8025_REG_MIN		0x01
     28#define RX8025_REG_HOUR		0x02
     29#define RX8025_REG_WDAY		0x03
     30#define RX8025_REG_MDAY		0x04
     31#define RX8025_REG_MONTH	0x05
     32#define RX8025_REG_YEAR		0x06
     33#define RX8025_REG_DIGOFF	0x07
     34#define RX8025_REG_ALWMIN	0x08
     35#define RX8025_REG_ALWHOUR	0x09
     36#define RX8025_REG_ALWWDAY	0x0a
     37#define RX8025_REG_ALDMIN	0x0b
     38#define RX8025_REG_ALDHOUR	0x0c
     39/* 0x0d is reserved */
     40#define RX8025_REG_CTRL1	0x0e
     41#define RX8025_REG_CTRL2	0x0f
     42
     43#define RX8025_BIT_CTRL1_CT	(7 << 0)
     44/* 1 Hz periodic level irq */
     45#define RX8025_BIT_CTRL1_CT_1HZ	4
     46#define RX8025_BIT_CTRL1_TEST	BIT(3)
     47#define RX8025_BIT_CTRL1_1224	BIT(5)
     48#define RX8025_BIT_CTRL1_DALE	BIT(6)
     49#define RX8025_BIT_CTRL1_WALE	BIT(7)
     50
     51#define RX8025_BIT_CTRL2_DAFG	BIT(0)
     52#define RX8025_BIT_CTRL2_WAFG	BIT(1)
     53#define RX8025_BIT_CTRL2_CTFG	BIT(2)
     54#define RX8025_BIT_CTRL2_PON	BIT(4)
     55#define RX8025_BIT_CTRL2_XST	BIT(5)
     56#define RX8025_BIT_CTRL2_VDET	BIT(6)
     57
     58/* Clock precision adjustment */
     59#define RX8025_ADJ_RESOLUTION	3050 /* in ppb */
     60#define RX8025_ADJ_DATA_MAX	62
     61#define RX8025_ADJ_DATA_MIN	-62
     62
     63enum rx_model {
     64	model_rx_unknown,
     65	model_rx_8025,
     66	model_rx_8035,
     67	model_last
     68};
     69
     70static const struct i2c_device_id rx8025_id[] = {
     71	{ "rx8025", model_rx_8025 },
     72	{ "rx8035", model_rx_8035 },
     73	{ }
     74};
     75MODULE_DEVICE_TABLE(i2c, rx8025_id);
     76
     77struct rx8025_data {
     78	struct rtc_device *rtc;
     79	enum rx_model model;
     80	u8 ctrl1;
     81};
     82
     83static s32 rx8025_read_reg(const struct i2c_client *client, u8 number)
     84{
     85	return i2c_smbus_read_byte_data(client, number << 4);
     86}
     87
     88static int rx8025_read_regs(const struct i2c_client *client,
     89			    u8 number, u8 length, u8 *values)
     90{
     91	int ret = i2c_smbus_read_i2c_block_data(client, number << 4, length,
     92						values);
     93	if (ret != length)
     94		return ret < 0 ? ret : -EIO;
     95
     96	return 0;
     97}
     98
     99static s32 rx8025_write_reg(const struct i2c_client *client, u8 number,
    100			    u8 value)
    101{
    102	return i2c_smbus_write_byte_data(client, number << 4, value);
    103}
    104
    105static s32 rx8025_write_regs(const struct i2c_client *client,
    106			     u8 number, u8 length, const u8 *values)
    107{
    108	return i2c_smbus_write_i2c_block_data(client, number << 4,
    109					      length, values);
    110}
    111
    112static int rx8025_is_osc_stopped(enum rx_model model, int ctrl2)
    113{
    114	int xstp = ctrl2 & RX8025_BIT_CTRL2_XST;
    115	/* XSTP bit has different polarity on RX-8025 vs RX-8035.
    116	 * RX-8025: 0 == oscillator stopped
    117	 * RX-8035: 1 == oscillator stopped
    118	 */
    119
    120	if (model == model_rx_8025)
    121		xstp = !xstp;
    122
    123	return xstp;
    124}
    125
    126static int rx8025_check_validity(struct device *dev)
    127{
    128	struct i2c_client *client = to_i2c_client(dev);
    129	struct rx8025_data *drvdata = dev_get_drvdata(dev);
    130	int ctrl2;
    131	int xstp;
    132
    133	ctrl2 = rx8025_read_reg(client, RX8025_REG_CTRL2);
    134	if (ctrl2 < 0)
    135		return ctrl2;
    136
    137	if (ctrl2 & RX8025_BIT_CTRL2_VDET)
    138		dev_warn(dev, "power voltage drop detected\n");
    139
    140	if (ctrl2 & RX8025_BIT_CTRL2_PON) {
    141		dev_warn(dev, "power-on reset detected, date is invalid\n");
    142		return -EINVAL;
    143	}
    144
    145	xstp = rx8025_is_osc_stopped(drvdata->model, ctrl2);
    146	if (xstp) {
    147		dev_warn(dev, "crystal stopped, date is invalid\n");
    148		return -EINVAL;
    149	}
    150
    151	return 0;
    152}
    153
    154static int rx8025_reset_validity(struct i2c_client *client)
    155{
    156	struct rx8025_data *drvdata = i2c_get_clientdata(client);
    157	int ctrl2 = rx8025_read_reg(client, RX8025_REG_CTRL2);
    158
    159	if (ctrl2 < 0)
    160		return ctrl2;
    161
    162	ctrl2 &= ~(RX8025_BIT_CTRL2_PON | RX8025_BIT_CTRL2_VDET);
    163
    164	if (drvdata->model == model_rx_8025)
    165		ctrl2 |= RX8025_BIT_CTRL2_XST;
    166	else
    167		ctrl2 &= ~(RX8025_BIT_CTRL2_XST);
    168
    169	return rx8025_write_reg(client, RX8025_REG_CTRL2,
    170				ctrl2);
    171}
    172
    173static irqreturn_t rx8025_handle_irq(int irq, void *dev_id)
    174{
    175	struct i2c_client *client = dev_id;
    176	struct rx8025_data *rx8025 = i2c_get_clientdata(client);
    177	int status, xstp;
    178
    179	rtc_lock(rx8025->rtc);
    180	status = rx8025_read_reg(client, RX8025_REG_CTRL2);
    181	if (status < 0)
    182		goto out;
    183
    184	xstp = rx8025_is_osc_stopped(rx8025->model, status);
    185	if (xstp)
    186		dev_warn(&client->dev, "Oscillation stop was detected,"
    187			 "you may have to readjust the clock\n");
    188
    189	if (status & RX8025_BIT_CTRL2_CTFG) {
    190		/* periodic */
    191		status &= ~RX8025_BIT_CTRL2_CTFG;
    192		rtc_update_irq(rx8025->rtc, 1, RTC_PF | RTC_IRQF);
    193	}
    194
    195	if (status & RX8025_BIT_CTRL2_DAFG) {
    196		/* alarm */
    197		status &= RX8025_BIT_CTRL2_DAFG;
    198		if (rx8025_write_reg(client, RX8025_REG_CTRL1,
    199				     rx8025->ctrl1 & ~RX8025_BIT_CTRL1_DALE))
    200			goto out;
    201		rtc_update_irq(rx8025->rtc, 1, RTC_AF | RTC_IRQF);
    202	}
    203
    204out:
    205	rtc_unlock(rx8025->rtc);
    206
    207	return IRQ_HANDLED;
    208}
    209
    210static int rx8025_get_time(struct device *dev, struct rtc_time *dt)
    211{
    212	struct i2c_client *client = to_i2c_client(dev);
    213	struct rx8025_data *rx8025 = dev_get_drvdata(dev);
    214	u8 date[7];
    215	int err;
    216
    217	err = rx8025_check_validity(dev);
    218	if (err)
    219		return err;
    220
    221	err = rx8025_read_regs(client, RX8025_REG_SEC, 7, date);
    222	if (err)
    223		return err;
    224
    225	dev_dbg(dev, "%s: read %7ph\n", __func__, date);
    226
    227	dt->tm_sec = bcd2bin(date[RX8025_REG_SEC] & 0x7f);
    228	dt->tm_min = bcd2bin(date[RX8025_REG_MIN] & 0x7f);
    229	if (rx8025->ctrl1 & RX8025_BIT_CTRL1_1224)
    230		dt->tm_hour = bcd2bin(date[RX8025_REG_HOUR] & 0x3f);
    231	else
    232		dt->tm_hour = bcd2bin(date[RX8025_REG_HOUR] & 0x1f) % 12
    233			+ (date[RX8025_REG_HOUR] & 0x20 ? 12 : 0);
    234
    235	dt->tm_mday = bcd2bin(date[RX8025_REG_MDAY] & 0x3f);
    236	dt->tm_mon = bcd2bin(date[RX8025_REG_MONTH] & 0x1f) - 1;
    237	dt->tm_year = bcd2bin(date[RX8025_REG_YEAR]) + 100;
    238
    239	dev_dbg(dev, "%s: date %ptRr\n", __func__, dt);
    240
    241	return 0;
    242}
    243
    244static int rx8025_set_time(struct device *dev, struct rtc_time *dt)
    245{
    246	struct i2c_client *client = to_i2c_client(dev);
    247	struct rx8025_data *rx8025 = dev_get_drvdata(dev);
    248	u8 date[7];
    249	int ret;
    250
    251	/*
    252	 * Here the read-only bits are written as "0".  I'm not sure if that
    253	 * is sound.
    254	 */
    255	date[RX8025_REG_SEC] = bin2bcd(dt->tm_sec);
    256	date[RX8025_REG_MIN] = bin2bcd(dt->tm_min);
    257	if (rx8025->ctrl1 & RX8025_BIT_CTRL1_1224)
    258		date[RX8025_REG_HOUR] = bin2bcd(dt->tm_hour);
    259	else
    260		date[RX8025_REG_HOUR] = (dt->tm_hour >= 12 ? 0x20 : 0)
    261			| bin2bcd((dt->tm_hour + 11) % 12 + 1);
    262
    263	date[RX8025_REG_WDAY] = bin2bcd(dt->tm_wday);
    264	date[RX8025_REG_MDAY] = bin2bcd(dt->tm_mday);
    265	date[RX8025_REG_MONTH] = bin2bcd(dt->tm_mon + 1);
    266	date[RX8025_REG_YEAR] = bin2bcd(dt->tm_year - 100);
    267
    268	dev_dbg(dev, "%s: write %7ph\n", __func__, date);
    269
    270	ret = rx8025_write_regs(client, RX8025_REG_SEC, 7, date);
    271	if (ret < 0)
    272		return ret;
    273
    274	return rx8025_reset_validity(client);
    275}
    276
    277static int rx8025_init_client(struct i2c_client *client)
    278{
    279	struct rx8025_data *rx8025 = i2c_get_clientdata(client);
    280	u8 ctrl[2], ctrl2;
    281	int need_clear = 0;
    282	int err;
    283
    284	err = rx8025_read_regs(client, RX8025_REG_CTRL1, 2, ctrl);
    285	if (err)
    286		goto out;
    287
    288	/* Keep test bit zero ! */
    289	rx8025->ctrl1 = ctrl[0] & ~RX8025_BIT_CTRL1_TEST;
    290
    291	if (ctrl[1] & (RX8025_BIT_CTRL2_DAFG | RX8025_BIT_CTRL2_WAFG)) {
    292		dev_warn(&client->dev, "Alarm was detected\n");
    293		need_clear = 1;
    294	}
    295
    296	if (ctrl[1] & RX8025_BIT_CTRL2_CTFG)
    297		need_clear = 1;
    298
    299	if (need_clear) {
    300		ctrl2 = ctrl[1];
    301		ctrl2 &= ~(RX8025_BIT_CTRL2_CTFG | RX8025_BIT_CTRL2_WAFG |
    302			   RX8025_BIT_CTRL2_DAFG);
    303
    304		err = rx8025_write_reg(client, RX8025_REG_CTRL2, ctrl2);
    305	}
    306out:
    307	return err;
    308}
    309
    310/* Alarm support */
    311static int rx8025_read_alarm(struct device *dev, struct rtc_wkalrm *t)
    312{
    313	struct i2c_client *client = to_i2c_client(dev);
    314	struct rx8025_data *rx8025 = dev_get_drvdata(dev);
    315	u8 ald[2];
    316	int ctrl2, err;
    317
    318	err = rx8025_read_regs(client, RX8025_REG_ALDMIN, 2, ald);
    319	if (err)
    320		return err;
    321
    322	ctrl2 = rx8025_read_reg(client, RX8025_REG_CTRL2);
    323	if (ctrl2 < 0)
    324		return ctrl2;
    325
    326	dev_dbg(dev, "%s: read alarm 0x%02x 0x%02x ctrl2 %02x\n",
    327		__func__, ald[0], ald[1], ctrl2);
    328
    329	/* Hardware alarms precision is 1 minute! */
    330	t->time.tm_sec = 0;
    331	t->time.tm_min = bcd2bin(ald[0] & 0x7f);
    332	if (rx8025->ctrl1 & RX8025_BIT_CTRL1_1224)
    333		t->time.tm_hour = bcd2bin(ald[1] & 0x3f);
    334	else
    335		t->time.tm_hour = bcd2bin(ald[1] & 0x1f) % 12
    336			+ (ald[1] & 0x20 ? 12 : 0);
    337
    338	dev_dbg(dev, "%s: date: %ptRr\n", __func__, &t->time);
    339	t->enabled = !!(rx8025->ctrl1 & RX8025_BIT_CTRL1_DALE);
    340	t->pending = (ctrl2 & RX8025_BIT_CTRL2_DAFG) && t->enabled;
    341
    342	return err;
    343}
    344
    345static int rx8025_set_alarm(struct device *dev, struct rtc_wkalrm *t)
    346{
    347	struct i2c_client *client = to_i2c_client(dev);
    348	struct rx8025_data *rx8025 = dev_get_drvdata(dev);
    349	u8 ald[2];
    350	int err;
    351
    352	ald[0] = bin2bcd(t->time.tm_min);
    353	if (rx8025->ctrl1 & RX8025_BIT_CTRL1_1224)
    354		ald[1] = bin2bcd(t->time.tm_hour);
    355	else
    356		ald[1] = (t->time.tm_hour >= 12 ? 0x20 : 0)
    357			| bin2bcd((t->time.tm_hour + 11) % 12 + 1);
    358
    359	dev_dbg(dev, "%s: write 0x%02x 0x%02x\n", __func__, ald[0], ald[1]);
    360
    361	if (rx8025->ctrl1 & RX8025_BIT_CTRL1_DALE) {
    362		rx8025->ctrl1 &= ~RX8025_BIT_CTRL1_DALE;
    363		err = rx8025_write_reg(client, RX8025_REG_CTRL1,
    364				       rx8025->ctrl1);
    365		if (err)
    366			return err;
    367	}
    368	err = rx8025_write_regs(client, RX8025_REG_ALDMIN, 2, ald);
    369	if (err)
    370		return err;
    371
    372	if (t->enabled) {
    373		rx8025->ctrl1 |= RX8025_BIT_CTRL1_DALE;
    374		err = rx8025_write_reg(client, RX8025_REG_CTRL1,
    375				       rx8025->ctrl1);
    376		if (err)
    377			return err;
    378	}
    379
    380	return 0;
    381}
    382
    383static int rx8025_alarm_irq_enable(struct device *dev, unsigned int enabled)
    384{
    385	struct i2c_client *client = to_i2c_client(dev);
    386	struct rx8025_data *rx8025 = dev_get_drvdata(dev);
    387	u8 ctrl1;
    388	int err;
    389
    390	ctrl1 = rx8025->ctrl1;
    391	if (enabled)
    392		ctrl1 |= RX8025_BIT_CTRL1_DALE;
    393	else
    394		ctrl1 &= ~RX8025_BIT_CTRL1_DALE;
    395
    396	if (ctrl1 != rx8025->ctrl1) {
    397		rx8025->ctrl1 = ctrl1;
    398		err = rx8025_write_reg(client, RX8025_REG_CTRL1,
    399				       rx8025->ctrl1);
    400		if (err)
    401			return err;
    402	}
    403	return 0;
    404}
    405
    406/*
    407 * According to the RX8025 SA/NB application manual the frequency and
    408 * temperature characteristics can be approximated using the following
    409 * equation:
    410 *
    411 *   df = a * (ut - t)**2
    412 *
    413 *   df: Frequency deviation in any temperature
    414 *   a : Coefficient = (-35 +-5) * 10**-9
    415 *   ut: Ultimate temperature in degree = +25 +-5 degree
    416 *   t : Any temperature in degree
    417 */
    418static int rx8025_read_offset(struct device *dev, long *offset)
    419{
    420	struct i2c_client *client = to_i2c_client(dev);
    421	int digoff;
    422
    423	digoff = rx8025_read_reg(client, RX8025_REG_DIGOFF);
    424	if (digoff < 0)
    425		return digoff;
    426
    427	*offset = digoff >= 64 ? digoff - 128 : digoff;
    428	if (*offset > 0)
    429		(*offset)--;
    430	*offset *= RX8025_ADJ_RESOLUTION;
    431
    432	return 0;
    433}
    434
    435static int rx8025_set_offset(struct device *dev, long offset)
    436{
    437	struct i2c_client *client = to_i2c_client(dev);
    438	u8 digoff;
    439
    440	offset /= RX8025_ADJ_RESOLUTION;
    441	if (offset > RX8025_ADJ_DATA_MAX)
    442		offset = RX8025_ADJ_DATA_MAX;
    443	else if (offset < RX8025_ADJ_DATA_MIN)
    444		offset = RX8025_ADJ_DATA_MIN;
    445	else if (offset > 0)
    446		offset++;
    447	else if (offset < 0)
    448		offset += 128;
    449	digoff = offset;
    450
    451	return rx8025_write_reg(client, RX8025_REG_DIGOFF, digoff);
    452}
    453
    454static const struct rtc_class_ops rx8025_rtc_ops = {
    455	.read_time = rx8025_get_time,
    456	.set_time = rx8025_set_time,
    457	.read_alarm = rx8025_read_alarm,
    458	.set_alarm = rx8025_set_alarm,
    459	.alarm_irq_enable = rx8025_alarm_irq_enable,
    460	.read_offset = rx8025_read_offset,
    461	.set_offset = rx8025_set_offset,
    462};
    463
    464static ssize_t rx8025_sysfs_show_clock_adjust(struct device *dev,
    465					      struct device_attribute *attr,
    466					      char *buf)
    467{
    468	long adj;
    469	int err;
    470
    471	dev_warn_once(dev, "clock_adjust_ppb is deprecated, use offset\n");
    472	err = rx8025_read_offset(dev, &adj);
    473	if (err)
    474		return err;
    475
    476	return sprintf(buf, "%ld\n", -adj);
    477}
    478
    479static ssize_t rx8025_sysfs_store_clock_adjust(struct device *dev,
    480					       struct device_attribute *attr,
    481					       const char *buf, size_t count)
    482{
    483	long adj;
    484	int err;
    485
    486	dev_warn_once(dev, "clock_adjust_ppb is deprecated, use offset\n");
    487	if (kstrtol(buf, 10, &adj) != 0)
    488		return -EINVAL;
    489
    490	err = rx8025_set_offset(dev, -adj);
    491
    492	return err ? err : count;
    493}
    494
    495static DEVICE_ATTR(clock_adjust_ppb, S_IRUGO | S_IWUSR,
    496		   rx8025_sysfs_show_clock_adjust,
    497		   rx8025_sysfs_store_clock_adjust);
    498
    499static struct attribute *rx8025_attrs[] = {
    500	&dev_attr_clock_adjust_ppb.attr,
    501	NULL
    502};
    503
    504static const struct attribute_group rx8025_attr_group = {
    505	.attrs	= rx8025_attrs,
    506};
    507
    508static int rx8025_probe(struct i2c_client *client,
    509			const struct i2c_device_id *id)
    510{
    511	struct i2c_adapter *adapter = client->adapter;
    512	struct rx8025_data *rx8025;
    513	int err = 0;
    514
    515	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA
    516				     | I2C_FUNC_SMBUS_I2C_BLOCK)) {
    517		dev_err(&adapter->dev,
    518			"doesn't support required functionality\n");
    519		return -EIO;
    520	}
    521
    522	rx8025 = devm_kzalloc(&client->dev, sizeof(*rx8025), GFP_KERNEL);
    523	if (!rx8025)
    524		return -ENOMEM;
    525
    526	i2c_set_clientdata(client, rx8025);
    527
    528	if (id)
    529		rx8025->model = id->driver_data;
    530
    531	err = rx8025_init_client(client);
    532	if (err)
    533		return err;
    534
    535	rx8025->rtc = devm_rtc_allocate_device(&client->dev);
    536	if (IS_ERR(rx8025->rtc))
    537		return PTR_ERR(rx8025->rtc);
    538
    539	rx8025->rtc->ops = &rx8025_rtc_ops;
    540	rx8025->rtc->range_min = RTC_TIMESTAMP_BEGIN_1900;
    541	rx8025->rtc->range_max = RTC_TIMESTAMP_END_2099;
    542
    543	if (client->irq > 0) {
    544		dev_info(&client->dev, "IRQ %d supplied\n", client->irq);
    545		err = devm_request_threaded_irq(&client->dev, client->irq, NULL,
    546						rx8025_handle_irq,
    547						IRQF_ONESHOT,
    548						"rx8025", client);
    549		if (err)
    550			clear_bit(RTC_FEATURE_ALARM, rx8025->rtc->features);
    551	}
    552
    553	rx8025->rtc->max_user_freq = 1;
    554
    555	set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rx8025->rtc->features);
    556	clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rx8025->rtc->features);
    557
    558	err = rtc_add_group(rx8025->rtc, &rx8025_attr_group);
    559	if (err)
    560		return err;
    561
    562	return devm_rtc_register_device(rx8025->rtc);
    563}
    564
    565static struct i2c_driver rx8025_driver = {
    566	.driver = {
    567		.name = "rtc-rx8025",
    568	},
    569	.probe		= rx8025_probe,
    570	.id_table	= rx8025_id,
    571};
    572
    573module_i2c_driver(rx8025_driver);
    574
    575MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>");
    576MODULE_DESCRIPTION("RX-8025 SA/NB RTC driver");
    577MODULE_LICENSE("GPL");