0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/module.h>
0010 #include <linux/i2c.h>
0011 #include <linux/slab.h>
0012 #include <linux/bcd.h>
0013 #include <linux/irqdomain.h>
0014 #include <linux/rtc.h>
0015 #include <linux/platform_device.h>
0016 #include <linux/mfd/max8998.h>
0017 #include <linux/mfd/max8998-private.h>
0018 #include <linux/delay.h>
0019
0020 #define MAX8998_RTC_SEC 0x00
0021 #define MAX8998_RTC_MIN 0x01
0022 #define MAX8998_RTC_HOUR 0x02
0023 #define MAX8998_RTC_WEEKDAY 0x03
0024 #define MAX8998_RTC_DATE 0x04
0025 #define MAX8998_RTC_MONTH 0x05
0026 #define MAX8998_RTC_YEAR1 0x06
0027 #define MAX8998_RTC_YEAR2 0x07
0028 #define MAX8998_ALARM0_SEC 0x08
0029 #define MAX8998_ALARM0_MIN 0x09
0030 #define MAX8998_ALARM0_HOUR 0x0a
0031 #define MAX8998_ALARM0_WEEKDAY 0x0b
0032 #define MAX8998_ALARM0_DATE 0x0c
0033 #define MAX8998_ALARM0_MONTH 0x0d
0034 #define MAX8998_ALARM0_YEAR1 0x0e
0035 #define MAX8998_ALARM0_YEAR2 0x0f
0036 #define MAX8998_ALARM1_SEC 0x10
0037 #define MAX8998_ALARM1_MIN 0x11
0038 #define MAX8998_ALARM1_HOUR 0x12
0039 #define MAX8998_ALARM1_WEEKDAY 0x13
0040 #define MAX8998_ALARM1_DATE 0x14
0041 #define MAX8998_ALARM1_MONTH 0x15
0042 #define MAX8998_ALARM1_YEAR1 0x16
0043 #define MAX8998_ALARM1_YEAR2 0x17
0044 #define MAX8998_ALARM0_CONF 0x18
0045 #define MAX8998_ALARM1_CONF 0x19
0046 #define MAX8998_RTC_STATUS 0x1a
0047 #define MAX8998_WTSR_SMPL_CNTL 0x1b
0048 #define MAX8998_TEST 0x1f
0049
0050 #define HOUR_12 (1 << 7)
0051 #define HOUR_PM (1 << 5)
0052 #define ALARM0_STATUS (1 << 1)
0053 #define ALARM1_STATUS (1 << 2)
0054
0055 enum {
0056 RTC_SEC = 0,
0057 RTC_MIN,
0058 RTC_HOUR,
0059 RTC_WEEKDAY,
0060 RTC_DATE,
0061 RTC_MONTH,
0062 RTC_YEAR1,
0063 RTC_YEAR2,
0064 };
0065
0066 struct max8998_rtc_info {
0067 struct device *dev;
0068 struct max8998_dev *max8998;
0069 struct i2c_client *rtc;
0070 struct rtc_device *rtc_dev;
0071 int irq;
0072 bool lp3974_bug_workaround;
0073 };
0074
0075 static void max8998_data_to_tm(u8 *data, struct rtc_time *tm)
0076 {
0077 tm->tm_sec = bcd2bin(data[RTC_SEC]);
0078 tm->tm_min = bcd2bin(data[RTC_MIN]);
0079 if (data[RTC_HOUR] & HOUR_12) {
0080 tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x1f);
0081 if (data[RTC_HOUR] & HOUR_PM)
0082 tm->tm_hour += 12;
0083 } else
0084 tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x3f);
0085
0086 tm->tm_wday = data[RTC_WEEKDAY] & 0x07;
0087 tm->tm_mday = bcd2bin(data[RTC_DATE]);
0088 tm->tm_mon = bcd2bin(data[RTC_MONTH]);
0089 tm->tm_year = bcd2bin(data[RTC_YEAR1]) + bcd2bin(data[RTC_YEAR2]) * 100;
0090 tm->tm_year -= 1900;
0091 }
0092
0093 static void max8998_tm_to_data(struct rtc_time *tm, u8 *data)
0094 {
0095 data[RTC_SEC] = bin2bcd(tm->tm_sec);
0096 data[RTC_MIN] = bin2bcd(tm->tm_min);
0097 data[RTC_HOUR] = bin2bcd(tm->tm_hour);
0098 data[RTC_WEEKDAY] = tm->tm_wday;
0099 data[RTC_DATE] = bin2bcd(tm->tm_mday);
0100 data[RTC_MONTH] = bin2bcd(tm->tm_mon);
0101 data[RTC_YEAR1] = bin2bcd(tm->tm_year % 100);
0102 data[RTC_YEAR2] = bin2bcd((tm->tm_year + 1900) / 100);
0103 }
0104
0105 static int max8998_rtc_read_time(struct device *dev, struct rtc_time *tm)
0106 {
0107 struct max8998_rtc_info *info = dev_get_drvdata(dev);
0108 u8 data[8];
0109 int ret;
0110
0111 ret = max8998_bulk_read(info->rtc, MAX8998_RTC_SEC, 8, data);
0112 if (ret < 0)
0113 return ret;
0114
0115 max8998_data_to_tm(data, tm);
0116
0117 return 0;
0118 }
0119
0120 static int max8998_rtc_set_time(struct device *dev, struct rtc_time *tm)
0121 {
0122 struct max8998_rtc_info *info = dev_get_drvdata(dev);
0123 u8 data[8];
0124 int ret;
0125
0126 max8998_tm_to_data(tm, data);
0127
0128 ret = max8998_bulk_write(info->rtc, MAX8998_RTC_SEC, 8, data);
0129
0130 if (info->lp3974_bug_workaround)
0131 msleep(2000);
0132
0133 return ret;
0134 }
0135
0136 static int max8998_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0137 {
0138 struct max8998_rtc_info *info = dev_get_drvdata(dev);
0139 u8 data[8];
0140 u8 val;
0141 int ret;
0142
0143 ret = max8998_bulk_read(info->rtc, MAX8998_ALARM0_SEC, 8, data);
0144 if (ret < 0)
0145 return ret;
0146
0147 max8998_data_to_tm(data, &alrm->time);
0148
0149 ret = max8998_read_reg(info->rtc, MAX8998_ALARM0_CONF, &val);
0150 if (ret < 0)
0151 return ret;
0152
0153 alrm->enabled = !!val;
0154
0155 ret = max8998_read_reg(info->rtc, MAX8998_RTC_STATUS, &val);
0156 if (ret < 0)
0157 return ret;
0158
0159 if (val & ALARM0_STATUS)
0160 alrm->pending = 1;
0161 else
0162 alrm->pending = 0;
0163
0164 return 0;
0165 }
0166
0167 static int max8998_rtc_stop_alarm(struct max8998_rtc_info *info)
0168 {
0169 int ret = max8998_write_reg(info->rtc, MAX8998_ALARM0_CONF, 0);
0170
0171 if (info->lp3974_bug_workaround)
0172 msleep(2000);
0173
0174 return ret;
0175 }
0176
0177 static int max8998_rtc_start_alarm(struct max8998_rtc_info *info)
0178 {
0179 int ret;
0180 u8 alarm0_conf = 0x77;
0181
0182
0183 if (info->lp3974_bug_workaround)
0184 alarm0_conf = 0x57;
0185
0186 ret = max8998_write_reg(info->rtc, MAX8998_ALARM0_CONF, alarm0_conf);
0187
0188 if (info->lp3974_bug_workaround)
0189 msleep(2000);
0190
0191 return ret;
0192 }
0193
0194 static int max8998_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
0195 {
0196 struct max8998_rtc_info *info = dev_get_drvdata(dev);
0197 u8 data[8];
0198 int ret;
0199
0200 max8998_tm_to_data(&alrm->time, data);
0201
0202 ret = max8998_rtc_stop_alarm(info);
0203 if (ret < 0)
0204 return ret;
0205
0206 ret = max8998_bulk_write(info->rtc, MAX8998_ALARM0_SEC, 8, data);
0207 if (ret < 0)
0208 return ret;
0209
0210 if (info->lp3974_bug_workaround)
0211 msleep(2000);
0212
0213 if (alrm->enabled)
0214 ret = max8998_rtc_start_alarm(info);
0215
0216 return ret;
0217 }
0218
0219 static int max8998_rtc_alarm_irq_enable(struct device *dev,
0220 unsigned int enabled)
0221 {
0222 struct max8998_rtc_info *info = dev_get_drvdata(dev);
0223
0224 if (enabled)
0225 return max8998_rtc_start_alarm(info);
0226 else
0227 return max8998_rtc_stop_alarm(info);
0228 }
0229
0230 static irqreturn_t max8998_rtc_alarm_irq(int irq, void *data)
0231 {
0232 struct max8998_rtc_info *info = data;
0233
0234 rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF);
0235
0236 return IRQ_HANDLED;
0237 }
0238
0239 static const struct rtc_class_ops max8998_rtc_ops = {
0240 .read_time = max8998_rtc_read_time,
0241 .set_time = max8998_rtc_set_time,
0242 .read_alarm = max8998_rtc_read_alarm,
0243 .set_alarm = max8998_rtc_set_alarm,
0244 .alarm_irq_enable = max8998_rtc_alarm_irq_enable,
0245 };
0246
0247 static int max8998_rtc_probe(struct platform_device *pdev)
0248 {
0249 struct max8998_dev *max8998 = dev_get_drvdata(pdev->dev.parent);
0250 struct max8998_platform_data *pdata = max8998->pdata;
0251 struct max8998_rtc_info *info;
0252 int ret;
0253
0254 info = devm_kzalloc(&pdev->dev, sizeof(struct max8998_rtc_info),
0255 GFP_KERNEL);
0256 if (!info)
0257 return -ENOMEM;
0258
0259 info->dev = &pdev->dev;
0260 info->max8998 = max8998;
0261 info->rtc = max8998->rtc;
0262
0263 platform_set_drvdata(pdev, info);
0264
0265 info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max8998-rtc",
0266 &max8998_rtc_ops, THIS_MODULE);
0267
0268 if (IS_ERR(info->rtc_dev)) {
0269 ret = PTR_ERR(info->rtc_dev);
0270 dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret);
0271 return ret;
0272 }
0273
0274 if (!max8998->irq_domain)
0275 goto no_irq;
0276
0277 info->irq = irq_create_mapping(max8998->irq_domain, MAX8998_IRQ_ALARM0);
0278 if (!info->irq) {
0279 dev_warn(&pdev->dev, "Failed to map alarm IRQ\n");
0280 goto no_irq;
0281 }
0282
0283 ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL,
0284 max8998_rtc_alarm_irq, 0, "rtc-alarm0", info);
0285
0286 if (ret < 0)
0287 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
0288 info->irq, ret);
0289
0290 no_irq:
0291 dev_info(&pdev->dev, "RTC CHIP NAME: %s\n", pdev->id_entry->name);
0292 if (pdata && pdata->rtc_delay) {
0293 info->lp3974_bug_workaround = true;
0294 dev_warn(&pdev->dev, "LP3974 with RTC REGERR option."
0295 " RTC updates will be extremely slow.\n");
0296 }
0297
0298 return 0;
0299 }
0300
0301 static const struct platform_device_id max8998_rtc_id[] = {
0302 { "max8998-rtc", TYPE_MAX8998 },
0303 { "lp3974-rtc", TYPE_LP3974 },
0304 { }
0305 };
0306 MODULE_DEVICE_TABLE(platform, max8998_rtc_id);
0307
0308 static struct platform_driver max8998_rtc_driver = {
0309 .driver = {
0310 .name = "max8998-rtc",
0311 },
0312 .probe = max8998_rtc_probe,
0313 .id_table = max8998_rtc_id,
0314 };
0315
0316 module_platform_driver(max8998_rtc_driver);
0317
0318 MODULE_AUTHOR("Minkyu Kang <mk7.kang@samsung.com>");
0319 MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>");
0320 MODULE_DESCRIPTION("Maxim MAX8998 RTC driver");
0321 MODULE_LICENSE("GPL");