1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * PS3 time and rtc routines. 4 * 5 * Copyright (C) 2006 Sony Computer Entertainment Inc. 6 * Copyright 2006 Sony Corp. 7 */ 8 9 #include <linux/kernel.h> 10 #include <linux/platform_device.h> 11 #include <linux/rtc.h> 12 13 #include <asm/firmware.h> 14 #include <asm/lv1call.h> 15 #include <asm/ps3.h> 16 17 #include "platform.h" 18 19 void __init ps3_calibrate_decr(void) 20 { 21 int result; 22 u64 tmp; 23 24 result = ps3_repository_read_be_tb_freq(0, &tmp); 25 BUG_ON(result); 26 27 ppc_tb_freq = tmp; 28 ppc_proc_freq = ppc_tb_freq * 40; 29 } 30 31 static u64 read_rtc(void) 32 { 33 int result; 34 u64 rtc_val; 35 u64 tb_val; 36 37 result = lv1_get_rtc(&rtc_val, &tb_val); 38 BUG_ON(result); 39 40 return rtc_val; 41 } 42 43 time64_t __init ps3_get_boot_time(void) 44 { 45 return read_rtc() + ps3_os_area_get_rtc_diff(); 46 } 47 48 static int __init ps3_rtc_init(void) 49 { 50 struct platform_device *pdev; 51 52 if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) 53 return -ENODEV; 54 55 pdev = platform_device_register_simple("rtc-ps3", -1, NULL, 0); 56 57 return PTR_ERR_OR_ZERO(pdev); 58 } 59 device_initcall(ps3_rtc_init); 60