Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 //
0003 // RTC driver for Maxim MAX8998
0004 //
0005 // Copyright (C) 2010 Samsung Electronics Co.Ltd
0006 // Author: Minkyu Kang <mk7.kang@samsung.com>
0007 // Author: Joonyoung Shim <jy0922.shim@samsung.com>
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     /* LP3974 with delay bug chips has rtc alarm bugs with "MONTH" field */
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");