18c2ecf20Sopenharmony_ci/* rtc-starfire.c: Starfire platform RTC driver. 28c2ecf20Sopenharmony_ci * 38c2ecf20Sopenharmony_ci * Author: David S. Miller 48c2ecf20Sopenharmony_ci * License: GPL 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Copyright (C) 2008 David S. Miller <davem@davemloft.net> 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/kernel.h> 108c2ecf20Sopenharmony_ci#include <linux/init.h> 118c2ecf20Sopenharmony_ci#include <linux/rtc.h> 128c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <asm/oplib.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistatic u32 starfire_get_time(void) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci static char obp_gettod[32]; 198c2ecf20Sopenharmony_ci static u32 unix_tod; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci sprintf(obp_gettod, "h# %08x unix-gettod", 228c2ecf20Sopenharmony_ci (unsigned int) (long) &unix_tod); 238c2ecf20Sopenharmony_ci prom_feval(obp_gettod); 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci return unix_tod; 268c2ecf20Sopenharmony_ci} 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic int starfire_read_time(struct device *dev, struct rtc_time *tm) 298c2ecf20Sopenharmony_ci{ 308c2ecf20Sopenharmony_ci rtc_time64_to_tm(starfire_get_time(), tm); 318c2ecf20Sopenharmony_ci return 0; 328c2ecf20Sopenharmony_ci} 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic const struct rtc_class_ops starfire_rtc_ops = { 358c2ecf20Sopenharmony_ci .read_time = starfire_read_time, 368c2ecf20Sopenharmony_ci}; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_cistatic int __init starfire_rtc_probe(struct platform_device *pdev) 398c2ecf20Sopenharmony_ci{ 408c2ecf20Sopenharmony_ci struct rtc_device *rtc; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci rtc = devm_rtc_allocate_device(&pdev->dev); 438c2ecf20Sopenharmony_ci if (IS_ERR(rtc)) 448c2ecf20Sopenharmony_ci return PTR_ERR(rtc); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci rtc->ops = &starfire_rtc_ops; 478c2ecf20Sopenharmony_ci rtc->range_max = U32_MAX; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci platform_set_drvdata(pdev, rtc); 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci return rtc_register_device(rtc); 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic struct platform_driver starfire_rtc_driver = { 558c2ecf20Sopenharmony_ci .driver = { 568c2ecf20Sopenharmony_ci .name = "rtc-starfire", 578c2ecf20Sopenharmony_ci }, 588c2ecf20Sopenharmony_ci}; 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_cibuiltin_platform_driver_probe(starfire_rtc_driver, starfire_rtc_probe); 61