^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * RTC driver for the Micro Crystal RV8803
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2015 Micro Crystal SA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Alexandre Belloni <alexandre.belloni@bootlin.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/bcd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/log2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/rtc.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define RV8803_I2C_TRY_COUNT 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define RV8803_SEC 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define RV8803_MIN 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define RV8803_HOUR 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define RV8803_WEEK 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define RV8803_DAY 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define RV8803_MONTH 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define RV8803_YEAR 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define RV8803_RAM 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define RV8803_ALARM_MIN 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define RV8803_ALARM_HOUR 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define RV8803_ALARM_WEEK_OR_DAY 0x0A
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define RV8803_EXT 0x0D
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define RV8803_FLAG 0x0E
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define RV8803_CTRL 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define RV8803_EXT_WADA BIT(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define RV8803_FLAG_V1F BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define RV8803_FLAG_V2F BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define RV8803_FLAG_AF BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define RV8803_FLAG_TF BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define RV8803_FLAG_UF BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define RV8803_CTRL_RESET BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define RV8803_CTRL_EIE BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define RV8803_CTRL_AIE BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define RV8803_CTRL_TIE BIT(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define RV8803_CTRL_UIE BIT(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define RX8900_BACKUP_CTRL 0x18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define RX8900_FLAG_SWOFF BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define RX8900_FLAG_VDETOFF BIT(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) enum rv8803_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) rv_8803,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) rx_8900
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct rv8803_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct rtc_device *rtc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct mutex flags_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) u8 ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) enum rv8803_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) static int rv8803_read_reg(const struct i2c_client *client, u8 reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) int try = RV8803_I2C_TRY_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) s32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * There is a 61µs window during which the RTC does not acknowledge I2C
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * transfers. In that case, ensure that there are multiple attempts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) ret = i2c_smbus_read_byte_data(client, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) while ((ret == -ENXIO || ret == -EIO) && --try);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) dev_err(&client->dev, "Unable to read register 0x%02x\n", reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) static int rv8803_read_regs(const struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u8 reg, u8 count, u8 *values)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) int try = RV8803_I2C_TRY_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) s32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) ret = i2c_smbus_read_i2c_block_data(client, reg, count, values);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) while ((ret == -ENXIO || ret == -EIO) && --try);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) if (ret != count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) dev_err(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) "Unable to read registers 0x%02x..0x%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) reg, reg + count - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) return ret < 0 ? ret : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) static int rv8803_write_reg(const struct i2c_client *client, u8 reg, u8 value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) int try = RV8803_I2C_TRY_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) s32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) ret = i2c_smbus_write_byte_data(client, reg, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) while ((ret == -ENXIO || ret == -EIO) && --try);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) dev_err(&client->dev, "Unable to write register 0x%02x\n", reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) static int rv8803_write_regs(const struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) u8 reg, u8 count, const u8 *values)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) int try = RV8803_I2C_TRY_COUNT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) s32 ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ret = i2c_smbus_write_i2c_block_data(client, reg, count,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) values);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) while ((ret == -ENXIO || ret == -EIO) && --try);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) dev_err(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) "Unable to write registers 0x%02x..0x%02x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) reg, reg + count - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static irqreturn_t rv8803_handle_irq(int irq, void *dev_id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) struct i2c_client *client = dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) struct rv8803_data *rv8803 = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) unsigned long events = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) mutex_lock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) flags = rv8803_read_reg(client, RV8803_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) if (flags <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) return IRQ_NONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) if (flags & RV8803_FLAG_V1F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) dev_warn(&client->dev, "Voltage low, temperature compensation stopped.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) if (flags & RV8803_FLAG_V2F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) dev_warn(&client->dev, "Voltage low, data loss detected.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) if (flags & RV8803_FLAG_TF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) flags &= ~RV8803_FLAG_TF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) rv8803->ctrl &= ~RV8803_CTRL_TIE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) events |= RTC_PF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) if (flags & RV8803_FLAG_AF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) flags &= ~RV8803_FLAG_AF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) rv8803->ctrl &= ~RV8803_CTRL_AIE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) events |= RTC_AF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (flags & RV8803_FLAG_UF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) flags &= ~RV8803_FLAG_UF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) rv8803->ctrl &= ~RV8803_CTRL_UIE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) events |= RTC_UF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) if (events) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) rtc_update_irq(rv8803->rtc, 1, events);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) rv8803_write_reg(client, RV8803_FLAG, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) rv8803_write_reg(rv8803->client, RV8803_CTRL, rv8803->ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) static int rv8803_get_time(struct device *dev, struct rtc_time *tm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) struct rv8803_data *rv8803 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) u8 date1[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) u8 date2[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) u8 *date = date1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) int ret, flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) flags = rv8803_read_reg(rv8803->client, RV8803_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) if (flags < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) return flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) if (flags & RV8803_FLAG_V2F) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) dev_warn(dev, "Voltage low, data is invalid.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) ret = rv8803_read_regs(rv8803->client, RV8803_SEC, 7, date);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) if ((date1[RV8803_SEC] & 0x7f) == bin2bcd(59)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) ret = rv8803_read_regs(rv8803->client, RV8803_SEC, 7, date2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) if ((date2[RV8803_SEC] & 0x7f) != bin2bcd(59))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) date = date2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) tm->tm_sec = bcd2bin(date[RV8803_SEC] & 0x7f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) tm->tm_min = bcd2bin(date[RV8803_MIN] & 0x7f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) tm->tm_hour = bcd2bin(date[RV8803_HOUR] & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) tm->tm_wday = ilog2(date[RV8803_WEEK] & 0x7f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) tm->tm_mday = bcd2bin(date[RV8803_DAY] & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) tm->tm_mon = bcd2bin(date[RV8803_MONTH] & 0x1f) - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) tm->tm_year = bcd2bin(date[RV8803_YEAR]) + 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) static int rv8803_set_time(struct device *dev, struct rtc_time *tm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) struct rv8803_data *rv8803 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) u8 date[7];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) int ctrl, flags, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) ctrl = rv8803_read_reg(rv8803->client, RV8803_CTRL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) if (ctrl < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) return ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) /* Stop the clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) ret = rv8803_write_reg(rv8803->client, RV8803_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) ctrl | RV8803_CTRL_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) date[RV8803_SEC] = bin2bcd(tm->tm_sec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) date[RV8803_MIN] = bin2bcd(tm->tm_min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) date[RV8803_HOUR] = bin2bcd(tm->tm_hour);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) date[RV8803_WEEK] = 1 << (tm->tm_wday);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) date[RV8803_DAY] = bin2bcd(tm->tm_mday);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) date[RV8803_MONTH] = bin2bcd(tm->tm_mon + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) date[RV8803_YEAR] = bin2bcd(tm->tm_year - 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) ret = rv8803_write_regs(rv8803->client, RV8803_SEC, 7, date);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) /* Restart the clock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) ret = rv8803_write_reg(rv8803->client, RV8803_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) ctrl & ~RV8803_CTRL_RESET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) mutex_lock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) flags = rv8803_read_reg(rv8803->client, RV8803_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) if (flags < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) return flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) ret = rv8803_write_reg(rv8803->client, RV8803_FLAG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) flags & ~(RV8803_FLAG_V1F | RV8803_FLAG_V2F));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) static int rv8803_get_alarm(struct device *dev, struct rtc_wkalrm *alrm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) struct rv8803_data *rv8803 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) struct i2c_client *client = rv8803->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) u8 alarmvals[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) int flags, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) ret = rv8803_read_regs(client, RV8803_ALARM_MIN, 3, alarmvals);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) flags = rv8803_read_reg(client, RV8803_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) if (flags < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) return flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) alrm->time.tm_sec = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) alrm->time.tm_min = bcd2bin(alarmvals[0] & 0x7f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) alrm->time.tm_hour = bcd2bin(alarmvals[1] & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) alrm->time.tm_mday = bcd2bin(alarmvals[2] & 0x3f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) alrm->enabled = !!(rv8803->ctrl & RV8803_CTRL_AIE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) alrm->pending = (flags & RV8803_FLAG_AF) && alrm->enabled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) static int rv8803_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) struct i2c_client *client = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) struct rv8803_data *rv8803 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) u8 alarmvals[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) u8 ctrl[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) int ret, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) /* The alarm has no seconds, round up to nearest minute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) if (alrm->time.tm_sec) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) time64_t alarm_time = rtc_tm_to_time64(&alrm->time);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) alarm_time += 60 - alrm->time.tm_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) rtc_time64_to_tm(alarm_time, &alrm->time);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) mutex_lock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) ret = rv8803_read_regs(client, RV8803_FLAG, 2, ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) alarmvals[0] = bin2bcd(alrm->time.tm_min);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) alarmvals[1] = bin2bcd(alrm->time.tm_hour);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) alarmvals[2] = bin2bcd(alrm->time.tm_mday);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (rv8803->ctrl & (RV8803_CTRL_AIE | RV8803_CTRL_UIE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) rv8803->ctrl &= ~(RV8803_CTRL_AIE | RV8803_CTRL_UIE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) err = rv8803_write_reg(rv8803->client, RV8803_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) rv8803->ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) ctrl[1] &= ~RV8803_FLAG_AF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) err = rv8803_write_reg(rv8803->client, RV8803_FLAG, ctrl[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) err = rv8803_write_regs(rv8803->client, RV8803_ALARM_MIN, 3, alarmvals);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) if (alrm->enabled) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) if (rv8803->rtc->uie_rtctimer.enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) rv8803->ctrl |= RV8803_CTRL_UIE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) if (rv8803->rtc->aie_timer.enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) rv8803->ctrl |= RV8803_CTRL_AIE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) err = rv8803_write_reg(rv8803->client, RV8803_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) rv8803->ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) static int rv8803_alarm_irq_enable(struct device *dev, unsigned int enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) struct i2c_client *client = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) struct rv8803_data *rv8803 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) int ctrl, flags, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) ctrl = rv8803->ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if (enabled) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) if (rv8803->rtc->uie_rtctimer.enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) ctrl |= RV8803_CTRL_UIE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) if (rv8803->rtc->aie_timer.enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) ctrl |= RV8803_CTRL_AIE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) if (!rv8803->rtc->uie_rtctimer.enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) ctrl &= ~RV8803_CTRL_UIE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) if (!rv8803->rtc->aie_timer.enabled)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) ctrl &= ~RV8803_CTRL_AIE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) mutex_lock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) flags = rv8803_read_reg(client, RV8803_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) if (flags < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) return flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) flags &= ~(RV8803_FLAG_AF | RV8803_FLAG_UF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) err = rv8803_write_reg(client, RV8803_FLAG, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) if (ctrl != rv8803->ctrl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) rv8803->ctrl = ctrl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) err = rv8803_write_reg(client, RV8803_CTRL, rv8803->ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) static int rv8803_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) struct i2c_client *client = to_i2c_client(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) struct rv8803_data *rv8803 = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) unsigned int vl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) int flags, ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) case RTC_VL_READ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) flags = rv8803_read_reg(client, RV8803_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) if (flags < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) return flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) if (flags & RV8803_FLAG_V1F) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) dev_warn(&client->dev, "Voltage low, temperature compensation stopped.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) vl = RTC_VL_ACCURACY_LOW;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) if (flags & RV8803_FLAG_V2F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) vl |= RTC_VL_DATA_INVALID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) return put_user(vl, (unsigned int __user *)arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) case RTC_VL_CLR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) mutex_lock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) flags = rv8803_read_reg(client, RV8803_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) if (flags < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) return flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) flags &= ~RV8803_FLAG_V1F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) ret = rv8803_write_reg(client, RV8803_FLAG, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) mutex_unlock(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) return -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) static int rv8803_nvram_write(void *priv, unsigned int offset, void *val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) size_t bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) return rv8803_write_reg(priv, RV8803_RAM, *(u8 *)val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) static int rv8803_nvram_read(void *priv, unsigned int offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) void *val, size_t bytes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) ret = rv8803_read_reg(priv, RV8803_RAM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) *(u8 *)val = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) static struct rtc_class_ops rv8803_rtc_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) .read_time = rv8803_get_time,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) .set_time = rv8803_set_time,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) .ioctl = rv8803_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) static int rx8900_trickle_charger_init(struct rv8803_data *rv8803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) struct i2c_client *client = rv8803->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) struct device_node *node = client->dev.of_node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) u8 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) if (!node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) if (rv8803->type != rx_8900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) err = i2c_smbus_read_byte_data(rv8803->client, RX8900_BACKUP_CTRL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) flags = ~(RX8900_FLAG_VDETOFF | RX8900_FLAG_SWOFF) & (u8)err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) if (of_property_read_bool(node, "epson,vdet-disable"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) flags |= RX8900_FLAG_VDETOFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) if (of_property_read_bool(node, "trickle-diode-disable"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) flags |= RX8900_FLAG_SWOFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) return i2c_smbus_write_byte_data(rv8803->client, RX8900_BACKUP_CTRL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) static int rv8803_probe(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) const struct i2c_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) struct i2c_adapter *adapter = client->adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) struct rv8803_data *rv8803;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) int err, flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) struct nvmem_config nvmem_cfg = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) .name = "rv8803_nvram",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) .word_size = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) .stride = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) .size = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) .reg_read = rv8803_nvram_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) .reg_write = rv8803_nvram_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) .priv = client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) I2C_FUNC_SMBUS_I2C_BLOCK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) dev_err(&adapter->dev, "doesn't support I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_I2C_BLOCK\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) rv8803 = devm_kzalloc(&client->dev, sizeof(struct rv8803_data),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (!rv8803)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) mutex_init(&rv8803->flags_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) rv8803->client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) if (client->dev.of_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) rv8803->type = (enum rv8803_type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) of_device_get_match_data(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) rv8803->type = id->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) i2c_set_clientdata(client, rv8803);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) flags = rv8803_read_reg(client, RV8803_FLAG);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) if (flags < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) return flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) if (flags & RV8803_FLAG_V1F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) dev_warn(&client->dev, "Voltage low, temperature compensation stopped.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) if (flags & RV8803_FLAG_V2F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) dev_warn(&client->dev, "Voltage low, data loss detected.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) if (flags & RV8803_FLAG_AF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) dev_warn(&client->dev, "An alarm maybe have been missed.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) rv8803->rtc = devm_rtc_allocate_device(&client->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) if (IS_ERR(rv8803->rtc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) return PTR_ERR(rv8803->rtc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) if (client->irq > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) err = devm_request_threaded_irq(&client->dev, client->irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) NULL, rv8803_handle_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) IRQF_TRIGGER_LOW | IRQF_ONESHOT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) "rv8803", client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) dev_warn(&client->dev, "unable to request IRQ, alarms disabled\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) client->irq = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) rv8803_rtc_ops.read_alarm = rv8803_get_alarm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) rv8803_rtc_ops.set_alarm = rv8803_set_alarm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) rv8803_rtc_ops.alarm_irq_enable = rv8803_alarm_irq_enable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) err = rv8803_write_reg(rv8803->client, RV8803_EXT, RV8803_EXT_WADA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) err = rx8900_trickle_charger_init(rv8803);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) dev_err(&client->dev, "failed to init charger\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) rv8803->rtc->ops = &rv8803_rtc_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) rv8803->rtc->nvram_old_abi = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) rv8803->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) rv8803->rtc->range_max = RTC_TIMESTAMP_END_2099;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) err = rtc_register_device(rv8803->rtc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) rtc_nvmem_register(rv8803->rtc, &nvmem_cfg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) rv8803->rtc->max_user_freq = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) static const struct i2c_device_id rv8803_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) { "rv8803", rv_8803 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) { "rx8803", rv_8803 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) { "rx8900", rx_8900 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) MODULE_DEVICE_TABLE(i2c, rv8803_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) static const struct of_device_id rv8803_of_match[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) .compatible = "microcrystal,rv8803",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) .data = (void *)rv_8803
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) .compatible = "epson,rx8803",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) .data = (void *)rv_8803
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) .compatible = "epson,rx8900",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) .data = (void *)rx_8900
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) MODULE_DEVICE_TABLE(of, rv8803_of_match);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) static struct i2c_driver rv8803_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) .name = "rtc-rv8803",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) .of_match_table = of_match_ptr(rv8803_of_match),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) .probe = rv8803_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) .id_table = rv8803_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) module_i2c_driver(rv8803_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) MODULE_AUTHOR("Alexandre Belloni <alexandre.belloni@bootlin.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) MODULE_DESCRIPTION("Micro Crystal RV8803 RTC driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) MODULE_LICENSE("GPL v2");