2019-03-20 15:44:26 +03:00
// SPDX-License-Identifier: GPL-2.0
2009-02-24 16:04:20 +03:00
/*
* PS3 RTC Driver
*
* Copyright 2009 Sony Corporation
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/platform_device.h>
# include <linux/rtc.h>
# include <asm/lv1call.h>
# include <asm/ps3.h>
static u64 read_rtc ( void )
{
int result ;
u64 rtc_val ;
u64 tb_val ;
result = lv1_get_rtc ( & rtc_val , & tb_val ) ;
BUG_ON ( result ) ;
return rtc_val ;
}
static int ps3_get_time ( struct device * dev , struct rtc_time * tm )
{
2019-03-20 15:44:25 +03:00
rtc_time64_to_tm ( read_rtc ( ) + ps3_os_area_get_rtc_diff ( ) , tm ) ;
2018-02-19 18:23:55 +03:00
return 0 ;
2009-02-24 16:04:20 +03:00
}
static int ps3_set_time ( struct device * dev , struct rtc_time * tm )
{
2019-03-20 15:44:25 +03:00
ps3_os_area_set_rtc_diff ( rtc_tm_to_time64 ( tm ) - read_rtc ( ) ) ;
2009-02-24 16:04:20 +03:00
return 0 ;
}
static const struct rtc_class_ops ps3_rtc_ops = {
. read_time = ps3_get_time ,
. set_time = ps3_set_time ,
} ;
static int __init ps3_rtc_probe ( struct platform_device * dev )
{
struct rtc_device * rtc ;
2019-03-20 15:44:27 +03:00
rtc = devm_rtc_allocate_device ( & dev - > dev ) ;
2009-02-24 16:04:20 +03:00
if ( IS_ERR ( rtc ) )
return PTR_ERR ( rtc ) ;
2019-03-20 15:44:27 +03:00
rtc - > ops = & ps3_rtc_ops ;
2019-03-20 15:44:28 +03:00
rtc - > range_max = U64_MAX ;
2019-03-20 15:44:27 +03:00
2009-02-24 16:04:20 +03:00
platform_set_drvdata ( dev , rtc ) ;
2019-03-20 15:44:27 +03:00
2020-11-09 19:34:08 +03:00
return devm_rtc_register_device ( rtc ) ;
2009-02-24 16:04:20 +03:00
}
static struct platform_driver ps3_rtc_driver = {
. driver = {
. name = " rtc-ps3 " ,
} ,
} ;
2013-04-30 03:18:48 +04:00
module_platform_driver_probe ( ps3_rtc_driver , ps3_rtc_probe ) ;
2009-02-24 16:04:20 +03:00
MODULE_AUTHOR ( " Sony Corporation " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_DESCRIPTION ( " ps3 RTC driver " ) ;
MODULE_ALIAS ( " platform:rtc-ps3 " ) ;