rtc-msm.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. /*
  2. * Copyright (C) 2008 Google, Inc.
  3. * Copyright (c) 2009-2011 The Linux Foundation. All rights reserved.
  4. * Author: San Mehat <san@google.com>
  5. *
  6. * This software is licensed under the terms of the GNU General Public
  7. * License version 2, as published by the Free Software Foundation, and
  8. * may be copied, distributed, and modified under those terms.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. */
  16. #include <linux/module.h>
  17. #include <linux/version.h>
  18. #include <linux/kernel.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/init.h>
  21. #include <linux/types.h>
  22. #include <linux/slab.h>
  23. #include <linux/android_alarm.h>
  24. #include <linux/rtc.h>
  25. #include <linux/rtc-msm.h>
  26. #include <linux/msm_rpcrouter.h>
  27. #include <mach/msm_rpcrouter.h>
  28. #define APP_TIMEREMOTE_PDEV_NAME "rs00000000"
  29. #define TIMEREMOTE_PROCEEDURE_SET_JULIAN 6
  30. #define TIMEREMOTE_PROCEEDURE_GET_JULIAN 7
  31. #ifdef CONFIG_RTC_SECURE_TIME_SUPPORT
  32. #define TIMEREMOTE_PROCEEDURE_GET_SECURE_JULIAN 11
  33. #define TIMEREMOTE_PROCEEDURE_SET_SECURE_JULIAN 16
  34. #endif
  35. #define TIMEREMOTE_PROG_NUMBER 0x30000048
  36. #define TIMEREMOTE_PROG_VER_1 0x00010001
  37. #define TIMEREMOTE_PROG_VER_2 0x00040001
  38. #define RTC_REQUEST_CB_PROC 0x17
  39. #define RTC_CLIENT_INIT_PROC 0x12
  40. #define RTC_EVENT_CB_PROC 0x1
  41. #define RTC_CB_ID 0x1
  42. /* Client request errors */
  43. enum rtc_rpc_err {
  44. ERR_NONE,
  45. ERR_CLIENT_ID_PTR, /* Invalid client ID pointer */
  46. ERR_CLIENT_TYPE, /* Invalid client type */
  47. ERR_CLIENT_ID, /* Invalid client ID */
  48. ERR_TASK_NOT_READY, /* task is not ready for clients */
  49. ERR_INVALID_PROCESSOR, /* Invalid processor id */
  50. ERR_UNSUPPORTED, /* Unsupported request */
  51. ERR_GENERAL, /* Any General Error */
  52. ERR_RPC, /* Any ONCRPC Error */
  53. ERR_ALREADY_REG, /* Client already registered */
  54. ERR_MAX
  55. };
  56. enum processor_type {
  57. CLIENT_PROCESSOR_NONE = 0,
  58. CLIENT_PROCESSOR_MODEM,
  59. CLIENT_PROCESSOR_APP1,
  60. CLIENT_PROCESSOR_APP2,
  61. CLIENT_PROCESSOR_MAX
  62. };
  63. /* Client types */
  64. enum client_type {
  65. CLIENT_TYPE_GEN1 = 0,
  66. CLIENT_FLOATING1,
  67. CLIENT_FLOATING2,
  68. CLIENT_TYPE_INTERNAL,
  69. CLIENT_TYPE_GENOFF_UPDATE,
  70. CLIENT_TYPE_MAX
  71. };
  72. /* Event types */
  73. enum event_type {
  74. EVENT_TOD_CHANGE = 0,
  75. EVENT_GENOFF_CHANGE,
  76. EVENT_MAX
  77. };
  78. struct tod_update_info {
  79. uint32_t tick;
  80. uint64_t stamp;
  81. uint32_t freq;
  82. };
  83. enum time_bases_info {
  84. TIME_RTC = 0,
  85. TIME_TOD,
  86. TIME_USER,
  87. TIME_SECURE,
  88. TIME_INVALID
  89. };
  90. struct genoff_update_info {
  91. enum time_bases_info time_base;
  92. uint64_t offset;
  93. };
  94. union cb_info {
  95. struct tod_update_info tod_update;
  96. struct genoff_update_info genoff_update;
  97. };
  98. struct rtc_cb_recv {
  99. uint32_t client_cb_id;
  100. enum event_type event;
  101. uint32_t cb_info_ptr;
  102. union cb_info cb_info_data;
  103. };
  104. struct msm_rtc {
  105. int proc;
  106. struct msm_rpc_client *rpc_client;
  107. u8 client_id;
  108. struct rtc_device *rtc;
  109. #ifdef CONFIG_RTC_SECURE_TIME_SUPPORT
  110. struct rtc_device *rtcsecure;
  111. #endif
  112. unsigned long rtcalarm_time;
  113. };
  114. struct rpc_time_julian {
  115. uint32_t year;
  116. uint32_t month;
  117. uint32_t day;
  118. uint32_t hour;
  119. uint32_t minute;
  120. uint32_t second;
  121. uint32_t day_of_week;
  122. };
  123. struct rtc_tod_args {
  124. int proc;
  125. struct rtc_time *tm;
  126. };
  127. #ifdef CONFIG_PM
  128. struct suspend_state_info {
  129. atomic_t state;
  130. int64_t tick_at_suspend;
  131. };
  132. static struct suspend_state_info suspend_state = {ATOMIC_INIT(0), 0};
  133. void msmrtc_updateatsuspend(struct timespec *ts)
  134. {
  135. int64_t now, sleep, sclk_max;
  136. if (atomic_read(&suspend_state.state)) {
  137. now = msm_timer_get_sclk_time(&sclk_max);
  138. if (now && suspend_state.tick_at_suspend) {
  139. if (now < suspend_state.tick_at_suspend) {
  140. sleep = sclk_max -
  141. suspend_state.tick_at_suspend + now;
  142. } else
  143. sleep = now - suspend_state.tick_at_suspend;
  144. timespec_add_ns(ts, sleep);
  145. suspend_state.tick_at_suspend = now;
  146. } else
  147. pr_err("%s: Invalid ticks from SCLK now=%lld"
  148. "tick_at_suspend=%lld", __func__, now,
  149. suspend_state.tick_at_suspend);
  150. }
  151. }
  152. #else
  153. void msmrtc_updateatsuspend(struct timespec *ts) { }
  154. #endif
  155. EXPORT_SYMBOL(msmrtc_updateatsuspend);
  156. static int msmrtc_tod_proc_args(struct msm_rpc_client *client, void *buff,
  157. void *data)
  158. {
  159. struct rtc_tod_args *rtc_args = data;
  160. if ((rtc_args->proc == TIMEREMOTE_PROCEEDURE_SET_JULIAN)
  161. #ifdef CONFIG_RTC_SECURE_TIME_SUPPORT
  162. || (rtc_args->proc == TIMEREMOTE_PROCEEDURE_SET_SECURE_JULIAN)
  163. #endif
  164. ) {
  165. struct timeremote_set_julian_req {
  166. uint32_t opt_arg;
  167. struct rpc_time_julian time;
  168. };
  169. struct timeremote_set_julian_req *set_req = buff;
  170. set_req->opt_arg = cpu_to_be32(0x1);
  171. set_req->time.year = cpu_to_be32(rtc_args->tm->tm_year);
  172. set_req->time.month = cpu_to_be32(rtc_args->tm->tm_mon + 1);
  173. set_req->time.day = cpu_to_be32(rtc_args->tm->tm_mday);
  174. set_req->time.hour = cpu_to_be32(rtc_args->tm->tm_hour);
  175. set_req->time.minute = cpu_to_be32(rtc_args->tm->tm_min);
  176. set_req->time.second = cpu_to_be32(rtc_args->tm->tm_sec);
  177. set_req->time.day_of_week = cpu_to_be32(rtc_args->tm->tm_wday);
  178. return sizeof(*set_req);
  179. } else if ((rtc_args->proc == TIMEREMOTE_PROCEEDURE_GET_JULIAN)
  180. #ifdef CONFIG_RTC_SECURE_TIME_SUPPORT
  181. || (rtc_args->proc == TIMEREMOTE_PROCEEDURE_GET_SECURE_JULIAN)
  182. #endif
  183. ) {
  184. *(uint32_t *)buff = (uint32_t) cpu_to_be32(0x1);
  185. return sizeof(uint32_t);
  186. } else
  187. return 0;
  188. }
  189. static bool rtc_check_overflow(struct rtc_time *tm)
  190. {
  191. if (tm->tm_year < 138)
  192. return false;
  193. if (tm->tm_year > 138)
  194. return true;
  195. if ((tm->tm_year == 138) && (tm->tm_mon == 0) && (tm->tm_mday < 19))
  196. return false;
  197. return true;
  198. }
  199. static int msmrtc_tod_proc_result(struct msm_rpc_client *client, void *buff,
  200. void *data)
  201. {
  202. struct rtc_tod_args *rtc_args = data;
  203. if ((rtc_args->proc == TIMEREMOTE_PROCEEDURE_GET_JULIAN)
  204. #ifdef CONFIG_RTC_SECURE_TIME_SUPPORT
  205. || (rtc_args->proc == TIMEREMOTE_PROCEEDURE_GET_SECURE_JULIAN)
  206. #endif
  207. ) {
  208. struct timeremote_get_julian_rep {
  209. uint32_t opt_arg;
  210. struct rpc_time_julian time;
  211. };
  212. struct timeremote_get_julian_rep *result = buff;
  213. if (be32_to_cpu(result->opt_arg) != 0x1)
  214. return -ENODATA;
  215. rtc_args->tm->tm_year = be32_to_cpu(result->time.year);
  216. rtc_args->tm->tm_mon = be32_to_cpu(result->time.month);
  217. rtc_args->tm->tm_mday = be32_to_cpu(result->time.day);
  218. rtc_args->tm->tm_hour = be32_to_cpu(result->time.hour);
  219. rtc_args->tm->tm_min = be32_to_cpu(result->time.minute);
  220. rtc_args->tm->tm_sec = be32_to_cpu(result->time.second);
  221. rtc_args->tm->tm_wday = be32_to_cpu(result->time.day_of_week);
  222. pr_debug("%s: %.2u/%.2u/%.4u %.2u:%.2u:%.2u (%.2u)\n",
  223. __func__, rtc_args->tm->tm_mon, rtc_args->tm->tm_mday,
  224. rtc_args->tm->tm_year, rtc_args->tm->tm_hour,
  225. rtc_args->tm->tm_min, rtc_args->tm->tm_sec,
  226. rtc_args->tm->tm_wday);
  227. /* RTC layer expects years to start at 1900 */
  228. rtc_args->tm->tm_year -= 1900;
  229. /* RTC layer expects mons to be 0 based */
  230. rtc_args->tm->tm_mon--;
  231. if (rtc_valid_tm(rtc_args->tm) < 0) {
  232. pr_err("%s: Retrieved data/time not valid\n", __func__);
  233. rtc_time_to_tm(0, rtc_args->tm);
  234. }
  235. /*
  236. * Check if the time received is > 01-19-2038, to prevent
  237. * overflow. In such a case, return the EPOCH time.
  238. */
  239. if (rtc_check_overflow(rtc_args->tm) == true) {
  240. pr_err("Invalid time (year > 2038)\n");
  241. rtc_time_to_tm(0, rtc_args->tm);
  242. }
  243. return 0;
  244. } else
  245. return 0;
  246. }
  247. static int
  248. msmrtc_timeremote_set_time(struct device *dev, struct rtc_time *tm)
  249. {
  250. int rc;
  251. struct rtc_tod_args rtc_args;
  252. struct msm_rtc *rtc_pdata = dev_get_drvdata(dev);
  253. if (tm->tm_year < 1900)
  254. tm->tm_year += 1900;
  255. if (tm->tm_year < 1970)
  256. return -EINVAL;
  257. dev_dbg(dev, "%s: %.2u/%.2u/%.4u %.2u:%.2u:%.2u (%.2u)\n",
  258. __func__, tm->tm_mon, tm->tm_mday, tm->tm_year,
  259. tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday);
  260. rtc_args.proc = TIMEREMOTE_PROCEEDURE_SET_JULIAN;
  261. rtc_args.tm = tm;
  262. rc = msm_rpc_client_req(rtc_pdata->rpc_client,
  263. TIMEREMOTE_PROCEEDURE_SET_JULIAN,
  264. msmrtc_tod_proc_args, &rtc_args,
  265. NULL, NULL, -1);
  266. if (rc) {
  267. dev_err(dev, "%s: rtc time (TOD) could not be set\n", __func__);
  268. return rc;
  269. }
  270. return 0;
  271. }
  272. static int
  273. msmrtc_timeremote_read_time(struct device *dev, struct rtc_time *tm)
  274. {
  275. int rc;
  276. struct rtc_tod_args rtc_args;
  277. struct msm_rtc *rtc_pdata = dev_get_drvdata(dev);
  278. rtc_args.proc = TIMEREMOTE_PROCEEDURE_GET_JULIAN;
  279. rtc_args.tm = tm;
  280. rc = msm_rpc_client_req(rtc_pdata->rpc_client,
  281. TIMEREMOTE_PROCEEDURE_GET_JULIAN,
  282. msmrtc_tod_proc_args, &rtc_args,
  283. msmrtc_tod_proc_result, &rtc_args, -1);
  284. if (rc) {
  285. dev_err(dev, "%s: Error retrieving rtc (TOD) time\n", __func__);
  286. return rc;
  287. }
  288. return 0;
  289. }
  290. static int
  291. msmrtc_virtual_alarm_set(struct device *dev, struct rtc_wkalrm *a)
  292. {
  293. struct msm_rtc *rtc_pdata = dev_get_drvdata(dev);
  294. unsigned long now = get_seconds();
  295. if (!a->enabled) {
  296. rtc_pdata->rtcalarm_time = 0;
  297. return 0;
  298. } else
  299. rtc_tm_to_time(&a->time, &(rtc_pdata->rtcalarm_time));
  300. if (now > rtc_pdata->rtcalarm_time) {
  301. dev_err(dev, "%s: Attempt to set alarm in the past\n",
  302. __func__);
  303. rtc_pdata->rtcalarm_time = 0;
  304. return -EINVAL;
  305. }
  306. return 0;
  307. }
  308. static struct rtc_class_ops msm_rtc_ops = {
  309. .read_time = msmrtc_timeremote_read_time,
  310. .set_time = msmrtc_timeremote_set_time,
  311. .set_alarm = msmrtc_virtual_alarm_set,
  312. };
  313. #ifdef CONFIG_RTC_SECURE_TIME_SUPPORT
  314. static int
  315. msmrtc_timeremote_set_time_secure(struct device *dev, struct rtc_time *tm)
  316. {
  317. int rc;
  318. struct rtc_tod_args rtc_args;
  319. struct msm_rtc *rtc_pdata = dev_get_drvdata(dev);
  320. if (tm->tm_year < 1900)
  321. tm->tm_year += 1900;
  322. if (tm->tm_year < 1970)
  323. return -EINVAL;
  324. dev_dbg(dev, "%s: %.2u/%.2u/%.4u %.2u:%.2u:%.2u (%.2u)\n",
  325. __func__, tm->tm_mon, tm->tm_mday, tm->tm_year,
  326. tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday);
  327. rtc_args.proc = TIMEREMOTE_PROCEEDURE_SET_SECURE_JULIAN;
  328. rtc_args.tm = tm;
  329. rc = msm_rpc_client_req(rtc_pdata->rpc_client,
  330. TIMEREMOTE_PROCEEDURE_SET_SECURE_JULIAN,
  331. msmrtc_tod_proc_args, &rtc_args,
  332. NULL, NULL, -1);
  333. if (rc) {
  334. dev_err(dev,
  335. "%s: rtc secure time could not be set\n", __func__);
  336. return rc;
  337. }
  338. return 0;
  339. }
  340. static int
  341. msmrtc_timeremote_read_time_secure(struct device *dev, struct rtc_time *tm)
  342. {
  343. int rc;
  344. struct rtc_tod_args rtc_args;
  345. struct msm_rtc *rtc_pdata = dev_get_drvdata(dev);
  346. rtc_args.proc = TIMEREMOTE_PROCEEDURE_GET_SECURE_JULIAN;
  347. rtc_args.tm = tm;
  348. rc = msm_rpc_client_req(rtc_pdata->rpc_client,
  349. TIMEREMOTE_PROCEEDURE_GET_SECURE_JULIAN, msmrtc_tod_proc_args,
  350. &rtc_args, msmrtc_tod_proc_result, &rtc_args, -1);
  351. if (rc) {
  352. dev_err(dev,
  353. "%s: Error retrieving secure rtc time\n", __func__);
  354. return rc;
  355. }
  356. return 0;
  357. }
  358. static struct rtc_class_ops msm_rtc_ops_secure = {
  359. .read_time = msmrtc_timeremote_read_time_secure,
  360. .set_time = msmrtc_timeremote_set_time_secure,
  361. };
  362. #endif
  363. static void process_cb_request(void *buffer)
  364. {
  365. struct rtc_cb_recv *rtc_cb = buffer;
  366. struct timespec ts, tv;
  367. rtc_cb->client_cb_id = be32_to_cpu(rtc_cb->client_cb_id);
  368. rtc_cb->event = be32_to_cpu(rtc_cb->event);
  369. rtc_cb->cb_info_ptr = be32_to_cpu(rtc_cb->cb_info_ptr);
  370. if (rtc_cb->event == EVENT_TOD_CHANGE) {
  371. /* A TOD update has been received from the Modem */
  372. rtc_cb->cb_info_data.tod_update.tick =
  373. be32_to_cpu(rtc_cb->cb_info_data.tod_update.tick);
  374. rtc_cb->cb_info_data.tod_update.stamp =
  375. be64_to_cpu(rtc_cb->cb_info_data.tod_update.stamp);
  376. rtc_cb->cb_info_data.tod_update.freq =
  377. be32_to_cpu(rtc_cb->cb_info_data.tod_update.freq);
  378. pr_info("RPC CALL -- TOD TIME UPDATE: ttick = %d\n"
  379. "stamp=%lld, freq = %d\n",
  380. rtc_cb->cb_info_data.tod_update.tick,
  381. rtc_cb->cb_info_data.tod_update.stamp,
  382. rtc_cb->cb_info_data.tod_update.freq);
  383. getnstimeofday(&ts);
  384. msmrtc_updateatsuspend(&ts);
  385. rtc_hctosys();
  386. getnstimeofday(&tv);
  387. /* Update the alarm information with the new time info. */
  388. alarm_update_timedelta(ts, tv);
  389. } else
  390. pr_err("%s: Unknown event EVENT=%x\n",
  391. __func__, rtc_cb->event);
  392. }
  393. static int msmrtc_cb_func(struct msm_rpc_client *client, void *buffer, int size)
  394. {
  395. int rc = -1;
  396. struct rpc_request_hdr *recv = buffer;
  397. recv->xid = be32_to_cpu(recv->xid);
  398. recv->type = be32_to_cpu(recv->type);
  399. recv->rpc_vers = be32_to_cpu(recv->rpc_vers);
  400. recv->prog = be32_to_cpu(recv->prog);
  401. recv->vers = be32_to_cpu(recv->vers);
  402. recv->procedure = be32_to_cpu(recv->procedure);
  403. if (recv->procedure == RTC_EVENT_CB_PROC)
  404. process_cb_request((void *) (recv + 1));
  405. msm_rpc_start_accepted_reply(client, recv->xid,
  406. RPC_ACCEPTSTAT_SUCCESS);
  407. rc = msm_rpc_send_accepted_reply(client, 0);
  408. if (rc) {
  409. pr_debug("%s: sending reply failed: %d\n", __func__, rc);
  410. return rc;
  411. }
  412. return 0;
  413. }
  414. static int msmrtc_rpc_proc_args(struct msm_rpc_client *client, void *buff,
  415. void *data)
  416. {
  417. struct msm_rtc *rtc_pdata = data;
  418. if (rtc_pdata->proc == RTC_CLIENT_INIT_PROC) {
  419. /* arguments passed to the client_init function */
  420. struct rtc_client_init_req {
  421. enum client_type client;
  422. uint32_t client_id_ptr;
  423. u8 client_id;
  424. enum processor_type processor;
  425. };
  426. struct rtc_client_init_req *req_1 = buff;
  427. req_1->client = cpu_to_be32(CLIENT_TYPE_INTERNAL);
  428. req_1->client_id_ptr = cpu_to_be32(0x1);
  429. req_1->client_id = (u8) cpu_to_be32(0x1);
  430. req_1->processor = cpu_to_be32(CLIENT_PROCESSOR_APP1);
  431. return sizeof(*req_1);
  432. } else if (rtc_pdata->proc == RTC_REQUEST_CB_PROC) {
  433. /* arguments passed to the request_cb function */
  434. struct rtc_event_req {
  435. u8 client_id;
  436. uint32_t rtc_cb_id;
  437. };
  438. struct rtc_event_req *req_2 = buff;
  439. req_2->client_id = (u8) cpu_to_be32(rtc_pdata->client_id);
  440. req_2->rtc_cb_id = cpu_to_be32(RTC_CB_ID);
  441. return sizeof(*req_2);
  442. } else
  443. return 0;
  444. }
  445. static int msmrtc_rpc_proc_result(struct msm_rpc_client *client, void *buff,
  446. void *data)
  447. {
  448. uint32_t result = -EINVAL;
  449. struct msm_rtc *rtc_pdata = data;
  450. if (rtc_pdata->proc == RTC_CLIENT_INIT_PROC) {
  451. /* process reply received from client_init function */
  452. uint32_t client_id_ptr;
  453. result = be32_to_cpu(*(uint32_t *)buff);
  454. buff += sizeof(uint32_t);
  455. client_id_ptr = be32_to_cpu(*(uint32_t *)(buff));
  456. buff += sizeof(uint32_t);
  457. if (client_id_ptr == 1)
  458. rtc_pdata->client_id = (u8)
  459. be32_to_cpu(*(uint32_t *)(buff));
  460. else {
  461. pr_debug("%s: Client-id not received from Modem\n",
  462. __func__);
  463. return -EINVAL;
  464. }
  465. } else if (rtc_pdata->proc == RTC_REQUEST_CB_PROC) {
  466. /* process reply received from request_cb function */
  467. result = be32_to_cpu(*(uint32_t *)buff);
  468. }
  469. if (result == ERR_NONE) {
  470. pr_debug("%s: RPC client reply for PROC=%x success\n",
  471. __func__, rtc_pdata->proc);
  472. return 0;
  473. }
  474. pr_debug("%s: RPC client registration failed ERROR=%x\n",
  475. __func__, result);
  476. return -EINVAL;
  477. }
  478. static int msmrtc_setup_cb(struct msm_rtc *rtc_pdata)
  479. {
  480. int rc;
  481. /* Register with the server with client specific info */
  482. rtc_pdata->proc = RTC_CLIENT_INIT_PROC;
  483. rc = msm_rpc_client_req(rtc_pdata->rpc_client, RTC_CLIENT_INIT_PROC,
  484. msmrtc_rpc_proc_args, rtc_pdata,
  485. msmrtc_rpc_proc_result, rtc_pdata, -1);
  486. if (rc) {
  487. pr_debug("%s: RPC client registration for PROC:%x failed\n",
  488. __func__, RTC_CLIENT_INIT_PROC);
  489. return rc;
  490. }
  491. /* Register with server for the callback event */
  492. rtc_pdata->proc = RTC_REQUEST_CB_PROC;
  493. rc = msm_rpc_client_req(rtc_pdata->rpc_client, RTC_REQUEST_CB_PROC,
  494. msmrtc_rpc_proc_args, rtc_pdata,
  495. msmrtc_rpc_proc_result, rtc_pdata, -1);
  496. if (rc) {
  497. pr_debug("%s: RPC client registration for PROC:%x failed\n",
  498. __func__, RTC_REQUEST_CB_PROC);
  499. }
  500. return rc;
  501. }
  502. static int __devinit
  503. msmrtc_probe(struct platform_device *pdev)
  504. {
  505. int rc;
  506. struct msm_rtc *rtc_pdata = NULL;
  507. struct rpcsvr_platform_device *rdev =
  508. container_of(pdev, struct rpcsvr_platform_device, base);
  509. uint32_t prog_version;
  510. if (pdev->id == (TIMEREMOTE_PROG_VER_1 & RPC_VERSION_MAJOR_MASK))
  511. prog_version = TIMEREMOTE_PROG_VER_1;
  512. else if (pdev->id == (TIMEREMOTE_PROG_VER_2 &
  513. RPC_VERSION_MAJOR_MASK))
  514. prog_version = TIMEREMOTE_PROG_VER_2;
  515. else
  516. return -EINVAL;
  517. rtc_pdata = kzalloc(sizeof(*rtc_pdata), GFP_KERNEL);
  518. if (rtc_pdata == NULL) {
  519. dev_err(&pdev->dev,
  520. "%s: Unable to allocate memory\n", __func__);
  521. return -ENOMEM;
  522. }
  523. rtc_pdata->rpc_client = msm_rpc_register_client("rtc", rdev->prog,
  524. prog_version, 1, msmrtc_cb_func);
  525. if (IS_ERR(rtc_pdata->rpc_client)) {
  526. dev_err(&pdev->dev,
  527. "%s: init RPC failed! VERS = %x\n", __func__,
  528. prog_version);
  529. rc = PTR_ERR(rtc_pdata->rpc_client);
  530. kfree(rtc_pdata);
  531. return rc;
  532. }
  533. /*
  534. * Set up the callback client.
  535. * For older targets this initialization will fail
  536. */
  537. rc = msmrtc_setup_cb(rtc_pdata);
  538. if (rc)
  539. dev_dbg(&pdev->dev, "%s: Could not initialize RPC callback\n",
  540. __func__);
  541. rtc_pdata->rtcalarm_time = 0;
  542. platform_set_drvdata(pdev, rtc_pdata);
  543. rtc_pdata->rtc = rtc_device_register("msm_rtc",
  544. &pdev->dev,
  545. &msm_rtc_ops,
  546. THIS_MODULE);
  547. if (IS_ERR(rtc_pdata->rtc)) {
  548. dev_err(&pdev->dev, "%s: Can't register RTC device (%ld)\n",
  549. pdev->name, PTR_ERR(rtc_pdata->rtc));
  550. rc = PTR_ERR(rtc_pdata->rtc);
  551. goto fail_cb_setup;
  552. }
  553. #ifdef CONFIG_RTC_SECURE_TIME_SUPPORT
  554. rtc_pdata->rtcsecure = rtc_device_register("msm_rtc_secure",
  555. &pdev->dev,
  556. &msm_rtc_ops_secure,
  557. THIS_MODULE);
  558. if (IS_ERR(rtc_pdata->rtcsecure)) {
  559. dev_err(&pdev->dev,
  560. "%s: Can't register RTC Secure device (%ld)\n",
  561. pdev->name, PTR_ERR(rtc_pdata->rtcsecure));
  562. rtc_device_unregister(rtc_pdata->rtc);
  563. rc = PTR_ERR(rtc_pdata->rtcsecure);
  564. goto fail_cb_setup;
  565. }
  566. #endif
  567. #ifdef CONFIG_RTC_ASYNC_MODEM_SUPPORT
  568. rtc_hctosys();
  569. #endif
  570. return 0;
  571. fail_cb_setup:
  572. msm_rpc_unregister_client(rtc_pdata->rpc_client);
  573. kfree(rtc_pdata);
  574. return rc;
  575. }
  576. #ifdef CONFIG_PM
  577. static void
  578. msmrtc_alarmtimer_expired(unsigned long _data,
  579. struct msm_rtc *rtc_pdata)
  580. {
  581. pr_debug("%s: Generating alarm event (src %lu)\n",
  582. rtc_pdata->rtc->name, _data);
  583. rtc_update_irq(rtc_pdata->rtc, 1, RTC_IRQF | RTC_AF);
  584. rtc_pdata->rtcalarm_time = 0;
  585. }
  586. static int
  587. msmrtc_suspend(struct platform_device *dev, pm_message_t state)
  588. {
  589. int rc, diff;
  590. struct rtc_time tm;
  591. unsigned long now;
  592. struct msm_rtc *rtc_pdata = platform_get_drvdata(dev);
  593. suspend_state.tick_at_suspend = msm_timer_get_sclk_time(NULL);
  594. if (rtc_pdata->rtcalarm_time) {
  595. rc = msmrtc_timeremote_read_time(&dev->dev, &tm);
  596. if (rc) {
  597. dev_err(&dev->dev,
  598. "%s: Unable to read from RTC\n", __func__);
  599. return rc;
  600. }
  601. rtc_tm_to_time(&tm, &now);
  602. diff = rtc_pdata->rtcalarm_time - now;
  603. if (diff <= 0) {
  604. msmrtc_alarmtimer_expired(1 , rtc_pdata);
  605. msm_pm_set_max_sleep_time(0);
  606. atomic_inc(&suspend_state.state);
  607. return 0;
  608. }
  609. msm_pm_set_max_sleep_time((int64_t)
  610. ((int64_t) diff * NSEC_PER_SEC));
  611. } else
  612. msm_pm_set_max_sleep_time(0);
  613. atomic_inc(&suspend_state.state);
  614. return 0;
  615. }
  616. static int
  617. msmrtc_resume(struct platform_device *dev)
  618. {
  619. int rc, diff;
  620. struct rtc_time tm;
  621. unsigned long now;
  622. struct msm_rtc *rtc_pdata = platform_get_drvdata(dev);
  623. if (rtc_pdata->rtcalarm_time) {
  624. rc = msmrtc_timeremote_read_time(&dev->dev, &tm);
  625. if (rc) {
  626. dev_err(&dev->dev,
  627. "%s: Unable to read from RTC\n", __func__);
  628. return rc;
  629. }
  630. rtc_tm_to_time(&tm, &now);
  631. diff = rtc_pdata->rtcalarm_time - now;
  632. if (diff <= 0)
  633. msmrtc_alarmtimer_expired(2 , rtc_pdata);
  634. }
  635. suspend_state.tick_at_suspend = 0;
  636. atomic_dec(&suspend_state.state);
  637. return 0;
  638. }
  639. #else
  640. #define msmrtc_suspend NULL
  641. #define msmrtc_resume NULL
  642. #endif
  643. static int __devexit msmrtc_remove(struct platform_device *pdev)
  644. {
  645. struct msm_rtc *rtc_pdata = platform_get_drvdata(pdev);
  646. rtc_device_unregister(rtc_pdata->rtc);
  647. #ifdef CONFIG_RTC_SECURE_TIME_SUPPORT
  648. rtc_device_unregister(rtc_pdata->rtcsecure);
  649. #endif
  650. msm_rpc_unregister_client(rtc_pdata->rpc_client);
  651. kfree(rtc_pdata);
  652. return 0;
  653. }
  654. static struct platform_driver msmrtc_driver = {
  655. .probe = msmrtc_probe,
  656. .suspend = msmrtc_suspend,
  657. .resume = msmrtc_resume,
  658. .remove = __devexit_p(msmrtc_remove),
  659. .driver = {
  660. .name = APP_TIMEREMOTE_PDEV_NAME,
  661. .owner = THIS_MODULE,
  662. },
  663. };
  664. static int __init msmrtc_init(void)
  665. {
  666. int rc;
  667. /*
  668. * For backward compatibility, register multiple platform
  669. * drivers with the RPC PROG_VERS to be supported.
  670. *
  671. * Explicit cast away of 'constness' for driver.name in order to
  672. * initialize it here.
  673. */
  674. snprintf((char *)msmrtc_driver.driver.name,
  675. strlen(msmrtc_driver.driver.name)+1,
  676. "rs%08x", TIMEREMOTE_PROG_NUMBER);
  677. pr_debug("RTC Registering with %s\n", msmrtc_driver.driver.name);
  678. rc = platform_driver_register(&msmrtc_driver);
  679. if (rc)
  680. pr_err("%s: platfrom_driver_register failed\n", __func__);
  681. return rc;
  682. }
  683. static void __exit msmrtc_exit(void)
  684. {
  685. platform_driver_unregister(&msmrtc_driver);
  686. }
  687. module_init(msmrtc_init);
  688. module_exit(msmrtc_exit);
  689. MODULE_DESCRIPTION("RTC driver for Qualcomm MSM7x00a chipsets");
  690. MODULE_AUTHOR("San Mehat <san@android.com>");
  691. MODULE_LICENSE("GPL");