1dc59ed38SLaxman Dewangan /* 2dc59ed38SLaxman Dewangan * rtc-tps6586x.c: RTC driver for TI PMIC TPS6586X 3dc59ed38SLaxman Dewangan * 4dc59ed38SLaxman Dewangan * Copyright (c) 2012, NVIDIA Corporation. 5dc59ed38SLaxman Dewangan * 6dc59ed38SLaxman Dewangan * Author: Laxman Dewangan <ldewangan@nvidia.com> 7dc59ed38SLaxman Dewangan * 8dc59ed38SLaxman Dewangan * This program is free software; you can redistribute it and/or 9dc59ed38SLaxman Dewangan * modify it under the terms of the GNU General Public License as 10dc59ed38SLaxman Dewangan * published by the Free Software Foundation version 2. 11dc59ed38SLaxman Dewangan * 12dc59ed38SLaxman Dewangan * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind, 13dc59ed38SLaxman Dewangan * whether express or implied; without even the implied warranty of 14dc59ed38SLaxman Dewangan * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15dc59ed38SLaxman Dewangan * General Public License for more details. 16dc59ed38SLaxman Dewangan * 17dc59ed38SLaxman Dewangan * You should have received a copy of the GNU General Public License 18dc59ed38SLaxman Dewangan * along with this program; if not, write to the Free Software 19dc59ed38SLaxman Dewangan * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 20dc59ed38SLaxman Dewangan * 02111-1307, USA 21dc59ed38SLaxman Dewangan */ 22dc59ed38SLaxman Dewangan 23dc59ed38SLaxman Dewangan #include <linux/device.h> 24dc59ed38SLaxman Dewangan #include <linux/err.h> 25dc59ed38SLaxman Dewangan #include <linux/init.h> 26dc59ed38SLaxman Dewangan #include <linux/kernel.h> 27dc59ed38SLaxman Dewangan #include <linux/mfd/tps6586x.h> 28dc59ed38SLaxman Dewangan #include <linux/module.h> 29dc59ed38SLaxman Dewangan #include <linux/platform_device.h> 30dc59ed38SLaxman Dewangan #include <linux/pm_runtime.h> 31dc59ed38SLaxman Dewangan #include <linux/rtc.h> 32dc59ed38SLaxman Dewangan #include <linux/slab.h> 33dc59ed38SLaxman Dewangan 34dc59ed38SLaxman Dewangan #define RTC_CTRL 0xc0 35dc59ed38SLaxman Dewangan #define POR_RESET_N BIT(7) 36dc59ed38SLaxman Dewangan #define OSC_SRC_SEL BIT(6) 37dc59ed38SLaxman Dewangan #define RTC_ENABLE BIT(5) /* enables alarm */ 38dc59ed38SLaxman Dewangan #define RTC_BUF_ENABLE BIT(4) /* 32 KHz buffer enable */ 39dc59ed38SLaxman Dewangan #define PRE_BYPASS BIT(3) /* 0=1KHz or 1=32KHz updates */ 40dc59ed38SLaxman Dewangan #define CL_SEL_MASK (BIT(2)|BIT(1)) 41dc59ed38SLaxman Dewangan #define CL_SEL_POS 1 42dc59ed38SLaxman Dewangan #define RTC_ALARM1_HI 0xc1 43dc59ed38SLaxman Dewangan #define RTC_COUNT4 0xc6 44dc59ed38SLaxman Dewangan 45dc59ed38SLaxman Dewangan /* start a PMU RTC access by reading the register prior to the RTC_COUNT4 */ 46dc59ed38SLaxman Dewangan #define RTC_COUNT4_DUMMYREAD 0xc5 47dc59ed38SLaxman Dewangan 48dc59ed38SLaxman Dewangan /*only 14-bits width in second*/ 49dc59ed38SLaxman Dewangan #define ALM1_VALID_RANGE_IN_SEC 0x3FFF 50dc59ed38SLaxman Dewangan 51dc59ed38SLaxman Dewangan #define TPS6586X_RTC_CL_SEL_1_5PF 0x0 52dc59ed38SLaxman Dewangan #define TPS6586X_RTC_CL_SEL_6_5PF 0x1 53dc59ed38SLaxman Dewangan #define TPS6586X_RTC_CL_SEL_7_5PF 0x2 54dc59ed38SLaxman Dewangan #define TPS6586X_RTC_CL_SEL_12_5PF 0x3 55dc59ed38SLaxman Dewangan 56dc59ed38SLaxman Dewangan struct tps6586x_rtc { 57dc59ed38SLaxman Dewangan struct device *dev; 58dc59ed38SLaxman Dewangan struct rtc_device *rtc; 59dc59ed38SLaxman Dewangan int irq; 60dc59ed38SLaxman Dewangan bool irq_en; 61dc59ed38SLaxman Dewangan unsigned long long epoch_start; 62dc59ed38SLaxman Dewangan }; 63dc59ed38SLaxman Dewangan 64dc59ed38SLaxman Dewangan static inline struct device *to_tps6586x_dev(struct device *dev) 65dc59ed38SLaxman Dewangan { 66dc59ed38SLaxman Dewangan return dev->parent; 67dc59ed38SLaxman Dewangan } 68dc59ed38SLaxman Dewangan 69dc59ed38SLaxman Dewangan static int tps6586x_rtc_read_time(struct device *dev, struct rtc_time *tm) 70dc59ed38SLaxman Dewangan { 71dc59ed38SLaxman Dewangan struct tps6586x_rtc *rtc = dev_get_drvdata(dev); 72dc59ed38SLaxman Dewangan struct device *tps_dev = to_tps6586x_dev(dev); 73dc59ed38SLaxman Dewangan unsigned long long ticks = 0; 74dc59ed38SLaxman Dewangan unsigned long seconds; 75dc59ed38SLaxman Dewangan u8 buff[6]; 76dc59ed38SLaxman Dewangan int ret; 77dc59ed38SLaxman Dewangan int i; 78dc59ed38SLaxman Dewangan 79dc59ed38SLaxman Dewangan ret = tps6586x_reads(tps_dev, RTC_COUNT4_DUMMYREAD, sizeof(buff), buff); 80dc59ed38SLaxman Dewangan if (ret < 0) { 81dc59ed38SLaxman Dewangan dev_err(dev, "read counter failed with err %d\n", ret); 82dc59ed38SLaxman Dewangan return ret; 83dc59ed38SLaxman Dewangan } 84dc59ed38SLaxman Dewangan 85dc59ed38SLaxman Dewangan for (i = 1; i < sizeof(buff); i++) { 86dc59ed38SLaxman Dewangan ticks <<= 8; 87dc59ed38SLaxman Dewangan ticks |= buff[i]; 88dc59ed38SLaxman Dewangan } 89dc59ed38SLaxman Dewangan 90dc59ed38SLaxman Dewangan seconds = ticks >> 10; 91dc59ed38SLaxman Dewangan seconds += rtc->epoch_start; 92dc59ed38SLaxman Dewangan rtc_time_to_tm(seconds, tm); 93dc59ed38SLaxman Dewangan return rtc_valid_tm(tm); 94dc59ed38SLaxman Dewangan } 95dc59ed38SLaxman Dewangan 96dc59ed38SLaxman Dewangan static int tps6586x_rtc_set_time(struct device *dev, struct rtc_time *tm) 97dc59ed38SLaxman Dewangan { 98dc59ed38SLaxman Dewangan struct tps6586x_rtc *rtc = dev_get_drvdata(dev); 99dc59ed38SLaxman Dewangan struct device *tps_dev = to_tps6586x_dev(dev); 100dc59ed38SLaxman Dewangan unsigned long long ticks; 101dc59ed38SLaxman Dewangan unsigned long seconds; 102dc59ed38SLaxman Dewangan u8 buff[5]; 103dc59ed38SLaxman Dewangan int ret; 104dc59ed38SLaxman Dewangan 105dc59ed38SLaxman Dewangan rtc_tm_to_time(tm, &seconds); 106dc59ed38SLaxman Dewangan if (seconds < rtc->epoch_start) { 107dc59ed38SLaxman Dewangan dev_err(dev, "requested time unsupported\n"); 108dc59ed38SLaxman Dewangan return -EINVAL; 109dc59ed38SLaxman Dewangan } 110dc59ed38SLaxman Dewangan seconds -= rtc->epoch_start; 111dc59ed38SLaxman Dewangan 112dc59ed38SLaxman Dewangan ticks = (unsigned long long)seconds << 10; 113dc59ed38SLaxman Dewangan buff[0] = (ticks >> 32) & 0xff; 114dc59ed38SLaxman Dewangan buff[1] = (ticks >> 24) & 0xff; 115dc59ed38SLaxman Dewangan buff[2] = (ticks >> 16) & 0xff; 116dc59ed38SLaxman Dewangan buff[3] = (ticks >> 8) & 0xff; 117dc59ed38SLaxman Dewangan buff[4] = ticks & 0xff; 118dc59ed38SLaxman Dewangan 119dc59ed38SLaxman Dewangan /* Disable RTC before changing time */ 120dc59ed38SLaxman Dewangan ret = tps6586x_clr_bits(tps_dev, RTC_CTRL, RTC_ENABLE); 121dc59ed38SLaxman Dewangan if (ret < 0) { 122dc59ed38SLaxman Dewangan dev_err(dev, "failed to clear RTC_ENABLE\n"); 123dc59ed38SLaxman Dewangan return ret; 124dc59ed38SLaxman Dewangan } 125dc59ed38SLaxman Dewangan 126dc59ed38SLaxman Dewangan ret = tps6586x_writes(tps_dev, RTC_COUNT4, sizeof(buff), buff); 127dc59ed38SLaxman Dewangan if (ret < 0) { 128dc59ed38SLaxman Dewangan dev_err(dev, "failed to program new time\n"); 129dc59ed38SLaxman Dewangan return ret; 130dc59ed38SLaxman Dewangan } 131dc59ed38SLaxman Dewangan 132dc59ed38SLaxman Dewangan /* Enable RTC */ 133dc59ed38SLaxman Dewangan ret = tps6586x_set_bits(tps_dev, RTC_CTRL, RTC_ENABLE); 134dc59ed38SLaxman Dewangan if (ret < 0) { 135dc59ed38SLaxman Dewangan dev_err(dev, "failed to set RTC_ENABLE\n"); 136dc59ed38SLaxman Dewangan return ret; 137dc59ed38SLaxman Dewangan } 138dc59ed38SLaxman Dewangan return 0; 139dc59ed38SLaxman Dewangan } 140dc59ed38SLaxman Dewangan 141dc59ed38SLaxman Dewangan static int tps6586x_rtc_alarm_irq_enable(struct device *dev, 142dc59ed38SLaxman Dewangan unsigned int enabled) 143dc59ed38SLaxman Dewangan { 144dc59ed38SLaxman Dewangan struct tps6586x_rtc *rtc = dev_get_drvdata(dev); 145dc59ed38SLaxman Dewangan 146dc59ed38SLaxman Dewangan if (enabled && !rtc->irq_en) { 147dc59ed38SLaxman Dewangan enable_irq(rtc->irq); 148dc59ed38SLaxman Dewangan rtc->irq_en = true; 149dc59ed38SLaxman Dewangan } else if (!enabled && rtc->irq_en) { 150dc59ed38SLaxman Dewangan disable_irq(rtc->irq); 151dc59ed38SLaxman Dewangan rtc->irq_en = false; 152dc59ed38SLaxman Dewangan } 153dc59ed38SLaxman Dewangan return 0; 154dc59ed38SLaxman Dewangan } 155dc59ed38SLaxman Dewangan 156dc59ed38SLaxman Dewangan static int tps6586x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) 157dc59ed38SLaxman Dewangan { 158dc59ed38SLaxman Dewangan struct tps6586x_rtc *rtc = dev_get_drvdata(dev); 159dc59ed38SLaxman Dewangan struct device *tps_dev = to_tps6586x_dev(dev); 160dc59ed38SLaxman Dewangan unsigned long seconds; 161dc59ed38SLaxman Dewangan unsigned long ticks; 162dc59ed38SLaxman Dewangan unsigned long rtc_current_time; 163dc59ed38SLaxman Dewangan unsigned long long rticks = 0; 164dc59ed38SLaxman Dewangan u8 buff[3]; 165dc59ed38SLaxman Dewangan u8 rbuff[6]; 166dc59ed38SLaxman Dewangan int ret; 167dc59ed38SLaxman Dewangan int i; 168dc59ed38SLaxman Dewangan 169dc59ed38SLaxman Dewangan rtc_tm_to_time(&alrm->time, &seconds); 170dc59ed38SLaxman Dewangan 171dc59ed38SLaxman Dewangan if (alrm->enabled && (seconds < rtc->epoch_start)) { 172dc59ed38SLaxman Dewangan dev_err(dev, "can't set alarm to requested time\n"); 173dc59ed38SLaxman Dewangan return -EINVAL; 174dc59ed38SLaxman Dewangan } 175dc59ed38SLaxman Dewangan 176dc59ed38SLaxman Dewangan ret = tps6586x_rtc_alarm_irq_enable(dev, alrm->enabled); 177dc59ed38SLaxman Dewangan if (ret < 0) { 178dc59ed38SLaxman Dewangan dev_err(dev, "can't set alarm irq, err %d\n", ret); 179dc59ed38SLaxman Dewangan return ret; 180dc59ed38SLaxman Dewangan } 181dc59ed38SLaxman Dewangan 182dc59ed38SLaxman Dewangan seconds -= rtc->epoch_start; 183dc59ed38SLaxman Dewangan ret = tps6586x_reads(tps_dev, RTC_COUNT4_DUMMYREAD, 184dc59ed38SLaxman Dewangan sizeof(rbuff), rbuff); 185dc59ed38SLaxman Dewangan if (ret < 0) { 186dc59ed38SLaxman Dewangan dev_err(dev, "read counter failed with err %d\n", ret); 187dc59ed38SLaxman Dewangan return ret; 188dc59ed38SLaxman Dewangan } 189dc59ed38SLaxman Dewangan 190dc59ed38SLaxman Dewangan for (i = 1; i < sizeof(rbuff); i++) { 191dc59ed38SLaxman Dewangan rticks <<= 8; 192dc59ed38SLaxman Dewangan rticks |= rbuff[i]; 193dc59ed38SLaxman Dewangan } 194dc59ed38SLaxman Dewangan 195dc59ed38SLaxman Dewangan rtc_current_time = rticks >> 10; 196dc59ed38SLaxman Dewangan if ((seconds - rtc_current_time) > ALM1_VALID_RANGE_IN_SEC) 197dc59ed38SLaxman Dewangan seconds = rtc_current_time - 1; 198dc59ed38SLaxman Dewangan 199dc59ed38SLaxman Dewangan ticks = (unsigned long long)seconds << 10; 200dc59ed38SLaxman Dewangan buff[0] = (ticks >> 16) & 0xff; 201dc59ed38SLaxman Dewangan buff[1] = (ticks >> 8) & 0xff; 202dc59ed38SLaxman Dewangan buff[2] = ticks & 0xff; 203dc59ed38SLaxman Dewangan 204dc59ed38SLaxman Dewangan ret = tps6586x_writes(tps_dev, RTC_ALARM1_HI, sizeof(buff), buff); 205dc59ed38SLaxman Dewangan if (ret) 206dc59ed38SLaxman Dewangan dev_err(dev, "programming alarm failed with err %d\n", ret); 207dc59ed38SLaxman Dewangan 208dc59ed38SLaxman Dewangan return ret; 209dc59ed38SLaxman Dewangan } 210dc59ed38SLaxman Dewangan 211dc59ed38SLaxman Dewangan static int tps6586x_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) 212dc59ed38SLaxman Dewangan { 213dc59ed38SLaxman Dewangan struct tps6586x_rtc *rtc = dev_get_drvdata(dev); 214dc59ed38SLaxman Dewangan struct device *tps_dev = to_tps6586x_dev(dev); 215dc59ed38SLaxman Dewangan unsigned long ticks; 216dc59ed38SLaxman Dewangan unsigned long seconds; 217dc59ed38SLaxman Dewangan u8 buff[3]; 218dc59ed38SLaxman Dewangan int ret; 219dc59ed38SLaxman Dewangan 220dc59ed38SLaxman Dewangan ret = tps6586x_reads(tps_dev, RTC_ALARM1_HI, sizeof(buff), buff); 221dc59ed38SLaxman Dewangan if (ret) { 222dc59ed38SLaxman Dewangan dev_err(dev, "read RTC_ALARM1_HI failed with err %d\n", ret); 223dc59ed38SLaxman Dewangan return ret; 224dc59ed38SLaxman Dewangan } 225dc59ed38SLaxman Dewangan 226dc59ed38SLaxman Dewangan ticks = (buff[0] << 16) | (buff[1] << 8) | buff[2]; 227dc59ed38SLaxman Dewangan seconds = ticks >> 10; 228dc59ed38SLaxman Dewangan seconds += rtc->epoch_start; 229dc59ed38SLaxman Dewangan 230dc59ed38SLaxman Dewangan rtc_time_to_tm(seconds, &alrm->time); 231dc59ed38SLaxman Dewangan return 0; 232dc59ed38SLaxman Dewangan } 233dc59ed38SLaxman Dewangan 234dc59ed38SLaxman Dewangan static const struct rtc_class_ops tps6586x_rtc_ops = { 235dc59ed38SLaxman Dewangan .read_time = tps6586x_rtc_read_time, 236dc59ed38SLaxman Dewangan .set_time = tps6586x_rtc_set_time, 237dc59ed38SLaxman Dewangan .set_alarm = tps6586x_rtc_set_alarm, 238dc59ed38SLaxman Dewangan .read_alarm = tps6586x_rtc_read_alarm, 239dc59ed38SLaxman Dewangan .alarm_irq_enable = tps6586x_rtc_alarm_irq_enable, 240dc59ed38SLaxman Dewangan }; 241dc59ed38SLaxman Dewangan 242dc59ed38SLaxman Dewangan static irqreturn_t tps6586x_rtc_irq(int irq, void *data) 243dc59ed38SLaxman Dewangan { 244dc59ed38SLaxman Dewangan struct tps6586x_rtc *rtc = data; 245dc59ed38SLaxman Dewangan 246dc59ed38SLaxman Dewangan rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_AF); 247dc59ed38SLaxman Dewangan return IRQ_HANDLED; 248dc59ed38SLaxman Dewangan } 249dc59ed38SLaxman Dewangan 250dc59ed38SLaxman Dewangan static int tps6586x_rtc_probe(struct platform_device *pdev) 251dc59ed38SLaxman Dewangan { 252dc59ed38SLaxman Dewangan struct device *tps_dev = to_tps6586x_dev(&pdev->dev); 253dc59ed38SLaxman Dewangan struct tps6586x_rtc *rtc; 254dc59ed38SLaxman Dewangan int ret; 255dc59ed38SLaxman Dewangan 256dc59ed38SLaxman Dewangan rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); 257dc59ed38SLaxman Dewangan if (!rtc) 258dc59ed38SLaxman Dewangan return -ENOMEM; 259dc59ed38SLaxman Dewangan 260dc59ed38SLaxman Dewangan rtc->dev = &pdev->dev; 261dc59ed38SLaxman Dewangan rtc->irq = platform_get_irq(pdev, 0); 262dc59ed38SLaxman Dewangan 263dc59ed38SLaxman Dewangan /* Set epoch start as 00:00:00:01:01:2009 */ 264dc59ed38SLaxman Dewangan rtc->epoch_start = mktime(2009, 1, 1, 0, 0, 0); 265dc59ed38SLaxman Dewangan 266dc59ed38SLaxman Dewangan /* 1 kHz tick mode, enable tick counting */ 267dc59ed38SLaxman Dewangan ret = tps6586x_update(tps_dev, RTC_CTRL, 268dc59ed38SLaxman Dewangan RTC_ENABLE | OSC_SRC_SEL | 269dc59ed38SLaxman Dewangan ((TPS6586X_RTC_CL_SEL_1_5PF << CL_SEL_POS) & CL_SEL_MASK), 270dc59ed38SLaxman Dewangan RTC_ENABLE | OSC_SRC_SEL | PRE_BYPASS | CL_SEL_MASK); 271dc59ed38SLaxman Dewangan if (ret < 0) { 272dc59ed38SLaxman Dewangan dev_err(&pdev->dev, "unable to start counter\n"); 273dc59ed38SLaxman Dewangan return ret; 274dc59ed38SLaxman Dewangan } 275dc59ed38SLaxman Dewangan 276dc59ed38SLaxman Dewangan platform_set_drvdata(pdev, rtc); 27777cf81b3SJingoo Han rtc->rtc = devm_rtc_device_register(&pdev->dev, dev_name(&pdev->dev), 278dc59ed38SLaxman Dewangan &tps6586x_rtc_ops, THIS_MODULE); 279dc59ed38SLaxman Dewangan if (IS_ERR(rtc->rtc)) { 280dc59ed38SLaxman Dewangan ret = PTR_ERR(rtc->rtc); 281dc59ed38SLaxman Dewangan dev_err(&pdev->dev, "RTC device register: ret %d\n", ret); 282dc59ed38SLaxman Dewangan goto fail_rtc_register; 283dc59ed38SLaxman Dewangan } 284dc59ed38SLaxman Dewangan 285190ab4afSJingoo Han ret = devm_request_threaded_irq(&pdev->dev, rtc->irq, NULL, 286190ab4afSJingoo Han tps6586x_rtc_irq, 287dc59ed38SLaxman Dewangan IRQF_ONESHOT | IRQF_EARLY_RESUME, 288dc59ed38SLaxman Dewangan dev_name(&pdev->dev), rtc); 289dc59ed38SLaxman Dewangan if (ret < 0) { 290dc59ed38SLaxman Dewangan dev_err(&pdev->dev, "request IRQ(%d) failed with ret %d\n", 291dc59ed38SLaxman Dewangan rtc->irq, ret); 292dc59ed38SLaxman Dewangan goto fail_req_irq; 293dc59ed38SLaxman Dewangan } 294dc59ed38SLaxman Dewangan disable_irq(rtc->irq); 295dc59ed38SLaxman Dewangan device_set_wakeup_capable(&pdev->dev, 1); 296dc59ed38SLaxman Dewangan return 0; 297dc59ed38SLaxman Dewangan 298dc59ed38SLaxman Dewangan fail_req_irq: 299dc59ed38SLaxman Dewangan rtc_device_unregister(rtc->rtc); 300dc59ed38SLaxman Dewangan 301dc59ed38SLaxman Dewangan fail_rtc_register: 302dc59ed38SLaxman Dewangan tps6586x_update(tps_dev, RTC_CTRL, 0, 303dc59ed38SLaxman Dewangan RTC_ENABLE | OSC_SRC_SEL | PRE_BYPASS | CL_SEL_MASK); 304dc59ed38SLaxman Dewangan return ret; 305dc59ed38SLaxman Dewangan }; 306dc59ed38SLaxman Dewangan 307dc59ed38SLaxman Dewangan static int tps6586x_rtc_remove(struct platform_device *pdev) 308dc59ed38SLaxman Dewangan { 309dc59ed38SLaxman Dewangan struct device *tps_dev = to_tps6586x_dev(&pdev->dev); 310dc59ed38SLaxman Dewangan 311dc59ed38SLaxman Dewangan tps6586x_update(tps_dev, RTC_CTRL, 0, 312dc59ed38SLaxman Dewangan RTC_ENABLE | OSC_SRC_SEL | PRE_BYPASS | CL_SEL_MASK); 313dc59ed38SLaxman Dewangan return 0; 314dc59ed38SLaxman Dewangan } 315dc59ed38SLaxman Dewangan 316dc59ed38SLaxman Dewangan #ifdef CONFIG_PM_SLEEP 317dc59ed38SLaxman Dewangan static int tps6586x_rtc_suspend(struct device *dev) 318dc59ed38SLaxman Dewangan { 319dc59ed38SLaxman Dewangan struct tps6586x_rtc *rtc = dev_get_drvdata(dev); 320dc59ed38SLaxman Dewangan 321dc59ed38SLaxman Dewangan if (device_may_wakeup(dev)) 322dc59ed38SLaxman Dewangan enable_irq_wake(rtc->irq); 323dc59ed38SLaxman Dewangan return 0; 324dc59ed38SLaxman Dewangan } 325dc59ed38SLaxman Dewangan 326dc59ed38SLaxman Dewangan static int tps6586x_rtc_resume(struct device *dev) 327dc59ed38SLaxman Dewangan { 328dc59ed38SLaxman Dewangan struct tps6586x_rtc *rtc = dev_get_drvdata(dev); 329dc59ed38SLaxman Dewangan 330dc59ed38SLaxman Dewangan if (device_may_wakeup(dev)) 331dc59ed38SLaxman Dewangan disable_irq_wake(rtc->irq); 332dc59ed38SLaxman Dewangan return 0; 333dc59ed38SLaxman Dewangan } 334dc59ed38SLaxman Dewangan #endif 335dc59ed38SLaxman Dewangan 336dc59ed38SLaxman Dewangan static const struct dev_pm_ops tps6586x_pm_ops = { 337dc59ed38SLaxman Dewangan SET_SYSTEM_SLEEP_PM_OPS(tps6586x_rtc_suspend, tps6586x_rtc_resume) 338dc59ed38SLaxman Dewangan }; 339dc59ed38SLaxman Dewangan 340dc59ed38SLaxman Dewangan static struct platform_driver tps6586x_rtc_driver = { 341dc59ed38SLaxman Dewangan .driver = { 342dc59ed38SLaxman Dewangan .name = "tps6586x-rtc", 343dc59ed38SLaxman Dewangan .owner = THIS_MODULE, 344dc59ed38SLaxman Dewangan .pm = &tps6586x_pm_ops, 345dc59ed38SLaxman Dewangan }, 346dc59ed38SLaxman Dewangan .probe = tps6586x_rtc_probe, 347dc59ed38SLaxman Dewangan .remove = tps6586x_rtc_remove, 348dc59ed38SLaxman Dewangan }; 349dc59ed38SLaxman Dewangan module_platform_driver(tps6586x_rtc_driver); 350dc59ed38SLaxman Dewangan 351dc59ed38SLaxman Dewangan MODULE_ALIAS("platform:rtc-tps6586x"); 352dc59ed38SLaxman Dewangan MODULE_DESCRIPTION("TI TPS6586x RTC driver"); 353dc59ed38SLaxman Dewangan MODULE_AUTHOR("Laxman dewangan <ldewangan@nvidia.com>"); 354dc59ed38SLaxman Dewangan MODULE_LICENSE("GPL v2"); 355