rtc-generic.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /* rtc-generic: RTC driver using the generic RTC abstraction
  2. *
  3. * Copyright (C) 2008 Kyle McMartin <kyle@mcmartin.ca>
  4. */
  5. #include <linux/kernel.h>
  6. #include <linux/module.h>
  7. #include <linux/time.h>
  8. #include <linux/platform_device.h>
  9. #include <linux/rtc.h>
  10. #if defined(CONFIG_M68K) || defined(CONFIG_PARISC) || \
  11. defined(CONFIG_PPC) || defined(CONFIG_SUPERH32)
  12. #include <asm/rtc.h>
  13. static int generic_get_time(struct device *dev, struct rtc_time *tm)
  14. {
  15. unsigned int ret = get_rtc_time(tm);
  16. if (ret & RTC_BATT_BAD)
  17. return -EOPNOTSUPP;
  18. return rtc_valid_tm(tm);
  19. }
  20. static int generic_set_time(struct device *dev, struct rtc_time *tm)
  21. {
  22. if (set_rtc_time(tm) < 0)
  23. return -EOPNOTSUPP;
  24. return 0;
  25. }
  26. static const struct rtc_class_ops generic_rtc_ops = {
  27. .read_time = generic_get_time,
  28. .set_time = generic_set_time,
  29. };
  30. #else
  31. #define generic_rtc_ops *(struct rtc_class_ops*)NULL
  32. #endif
  33. static int __init generic_rtc_probe(struct platform_device *dev)
  34. {
  35. struct rtc_device *rtc;
  36. const struct rtc_class_ops *ops;
  37. ops = dev_get_platdata(&dev->dev);
  38. if (!ops)
  39. ops = &generic_rtc_ops;
  40. rtc = devm_rtc_device_register(&dev->dev, "rtc-generic",
  41. ops, THIS_MODULE);
  42. if (IS_ERR(rtc))
  43. return PTR_ERR(rtc);
  44. platform_set_drvdata(dev, rtc);
  45. return 0;
  46. }
  47. static struct platform_driver generic_rtc_driver = {
  48. .driver = {
  49. .name = "rtc-generic",
  50. },
  51. };
  52. module_platform_driver_probe(generic_rtc_driver, generic_rtc_probe);
  53. MODULE_AUTHOR("Kyle McMartin <kyle@mcmartin.ca>");
  54. MODULE_LICENSE("GPL");
  55. MODULE_DESCRIPTION("Generic RTC driver");
  56. MODULE_ALIAS("platform:rtc-generic");