static void process_cb_request(void *buffer) { struct rtc_cb_recv *rtc_cb = buffer; struct timespec ts, tv; rtc_cb->client_cb_id = be32_to_cpu(rtc_cb->client_cb_id); rtc_cb->event = be32_to_cpu(rtc_cb->event); rtc_cb->cb_info_ptr = be32_to_cpu(rtc_cb->cb_info_ptr); if (rtc_cb->event == EVENT_TOD_CHANGE) { /* A TOD update has been received from the Modem */ rtc_cb->cb_info_data.tod_update.tick = be32_to_cpu(rtc_cb->cb_info_data.tod_update.tick); rtc_cb->cb_info_data.tod_update.stamp = be64_to_cpu(rtc_cb->cb_info_data.tod_update.stamp); rtc_cb->cb_info_data.tod_update.freq = be32_to_cpu(rtc_cb->cb_info_data.tod_update.freq); pr_info("RPC CALL -- TOD TIME UPDATE: ttick = %d\n" "stamp=%lld, freq = %d\n", rtc_cb->cb_info_data.tod_update.tick, rtc_cb->cb_info_data.tod_update.stamp, rtc_cb->cb_info_data.tod_update.freq); getnstimeofday(&ts); msmrtc_updateatsuspend(&ts); rtc_hctosys(); getnstimeofday(&tv); /* Update the alarm information with the new time info. */ alarm_update_timedelta(ts, tv); } else pr_err("%s: Unknown event EVENT=%x\n", __func__, rtc_cb->event); }
static int handle_rpc_call(struct msm_rpc_server *server, struct rpc_request_hdr *req, unsigned len) { struct timespec ts, tv; switch (req->procedure) { case RPC_TIME_REMOTE_MTOA_NULL: return 0; case RPC_TIME_TOD_SET_APPS_BASES: { struct rpc_time_tod_set_apps_bases_args *args; args = (struct rpc_time_tod_set_apps_bases_args *)(req + 1); args->tick = be32_to_cpu(args->tick); args->stamp = be64_to_cpu(args->stamp); printk(KERN_INFO "RPC_TIME_TOD_SET_APPS_BASES:\n" "\ttick = %d\n" "\tstamp = %lld\n", args->tick, args->stamp); getnstimeofday(&ts); msmrtc_updateatsuspend(&ts); rtc_hctosys(); getnstimeofday(&tv); /* Update the alarm information with the new time info. */ alarm_update_timedelta(ts, tv); #ifdef CONFIG_KYOCERA_ORIGINAL_FEATURE if(!get_usertime_setting()) { add_usertime_offset(&ts, &tv); } #endif /* CONFIG_KYOCERA_ORIGINAL_FEATURE */ return 0; } case RPC_TIME_GET_APPS_USER_TIME: return read_rtc0_time(server, req, len); default: return -ENODEV; } }