2008-08-29 10:02:36 +04:00
/* rtc-starfire.c: Starfire platform RTC driver.
*
* Copyright ( C ) 2008 David S . Miller < davem @ davemloft . net >
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/init.h>
# include <linux/rtc.h>
# include <linux/platform_device.h>
# include <asm/oplib.h>
MODULE_AUTHOR ( " David S. Miller <davem@davemloft.net> " ) ;
MODULE_DESCRIPTION ( " Starfire RTC driver " ) ;
MODULE_LICENSE ( " GPL " ) ;
static u32 starfire_get_time ( void )
{
static char obp_gettod [ 32 ] ;
static u32 unix_tod ;
sprintf ( obp_gettod , " h# %08x unix-gettod " ,
( unsigned int ) ( long ) & unix_tod ) ;
prom_feval ( obp_gettod ) ;
return unix_tod ;
}
static int starfire_read_time ( struct device * dev , struct rtc_time * tm )
{
2008-11-21 12:24:38 +03:00
rtc_time_to_tm ( starfire_get_time ( ) , tm ) ;
return rtc_valid_tm ( tm ) ;
2008-08-29 10:02:36 +04:00
}
static const struct rtc_class_ops starfire_rtc_ops = {
. read_time = starfire_read_time ,
} ;
2008-11-21 12:24:38 +03:00
static int __init starfire_rtc_probe ( struct platform_device * pdev )
2008-08-29 10:02:36 +04:00
{
2008-11-21 12:24:38 +03:00
struct rtc_device * rtc = rtc_device_register ( " starfire " , & pdev - > dev ,
& starfire_rtc_ops , THIS_MODULE ) ;
if ( IS_ERR ( rtc ) )
return PTR_ERR ( rtc ) ;
2008-08-29 10:02:36 +04:00
2008-11-21 12:24:38 +03:00
platform_set_drvdata ( pdev , rtc ) ;
2008-08-29 10:02:36 +04:00
return 0 ;
}
2008-11-21 12:24:38 +03:00
static int __exit starfire_rtc_remove ( struct platform_device * pdev )
2008-08-29 10:02:36 +04:00
{
2008-11-21 12:24:38 +03:00
struct rtc_device * rtc = platform_get_drvdata ( pdev ) ;
2008-08-29 10:02:36 +04:00
2008-11-21 12:24:38 +03:00
rtc_device_unregister ( rtc ) ;
2008-08-29 10:02:36 +04:00
return 0 ;
}
static struct platform_driver starfire_rtc_driver = {
. driver = {
. name = " rtc-starfire " ,
. owner = THIS_MODULE ,
} ,
2008-11-21 12:24:38 +03:00
. remove = __exit_p ( starfire_rtc_remove ) ,
2008-08-29 10:02:36 +04:00
} ;
static int __init starfire_rtc_init ( void )
{
2008-11-21 12:24:38 +03:00
return platform_driver_probe ( & starfire_rtc_driver , starfire_rtc_probe ) ;
2008-08-29 10:02:36 +04:00
}
static void __exit starfire_rtc_exit ( void )
{
platform_driver_unregister ( & starfire_rtc_driver ) ;
}
module_init ( starfire_rtc_init ) ;
module_exit ( starfire_rtc_exit ) ;