162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * PS3 time and rtc routines. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2006 Sony Computer Entertainment Inc. 662306a36Sopenharmony_ci * Copyright 2006 Sony Corp. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/kernel.h> 1062306a36Sopenharmony_ci#include <linux/platform_device.h> 1162306a36Sopenharmony_ci#include <linux/rtc.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <asm/firmware.h> 1462306a36Sopenharmony_ci#include <asm/lv1call.h> 1562306a36Sopenharmony_ci#include <asm/ps3.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include "platform.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_civoid __init ps3_calibrate_decr(void) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci int result; 2262306a36Sopenharmony_ci u64 tmp; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci result = ps3_repository_read_be_tb_freq(0, &tmp); 2562306a36Sopenharmony_ci BUG_ON(result); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci ppc_tb_freq = tmp; 2862306a36Sopenharmony_ci ppc_proc_freq = ppc_tb_freq * 40; 2962306a36Sopenharmony_ci} 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistatic u64 read_rtc(void) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci int result; 3462306a36Sopenharmony_ci u64 rtc_val; 3562306a36Sopenharmony_ci u64 tb_val; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci result = lv1_get_rtc(&rtc_val, &tb_val); 3862306a36Sopenharmony_ci BUG_ON(result); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci return rtc_val; 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_citime64_t __init ps3_get_boot_time(void) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci return read_rtc() + ps3_os_area_get_rtc_diff(); 4662306a36Sopenharmony_ci} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistatic int __init ps3_rtc_init(void) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci struct platform_device *pdev; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) 5362306a36Sopenharmony_ci return -ENODEV; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci pdev = platform_device_register_simple("rtc-ps3", -1, NULL, 0); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci return PTR_ERR_OR_ZERO(pdev); 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_cidevice_initcall(ps3_rtc_init); 60