| From 116fcbfed6ef4520d2d0f75d5bf6719d705cd140 Mon Sep 17 00:00:00 2001 |
| From: Mark Brown <broonie@opensource.wolfsonmicro.com> |
| Date: Thu, 5 Jul 2012 20:19:17 +0000 |
| Subject: [PATCH] rtc: wm831x: Feed the write counter into |
| device_add_randomness() |
| |
| commit 9dccf55f4cb011a7552a8a2749a580662f5ed8ed upstream. |
| |
| The tamper evident features of the RTC include the "write counter" which |
| is a pseudo-random number regenerated whenever we set the RTC. Since this |
| value is unpredictable it should provide some useful seeding to the random |
| number generator. |
| |
| Only do this on boot since the goal is to seed the pool rather than add |
| useful entropy. |
| |
| Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/rtc/rtc-wm831x.c b/drivers/rtc/rtc-wm831x.c |
| index b16cfe5..dce35ed 100644 |
| --- a/drivers/rtc/rtc-wm831x.c |
| +++ b/drivers/rtc/rtc-wm831x.c |
| @@ -24,7 +24,7 @@ |
| #include <linux/mfd/wm831x/core.h> |
| #include <linux/delay.h> |
| #include <linux/platform_device.h> |
| - |
| +#include <linux/random.h> |
| |
| /* |
| * R16416 (0x4020) - RTC Write Counter |
| @@ -96,6 +96,26 @@ struct wm831x_rtc { |
| unsigned int alarm_enabled:1; |
| }; |
| |
| +static void wm831x_rtc_add_randomness(struct wm831x *wm831x) |
| +{ |
| + int ret; |
| + u16 reg; |
| + |
| + /* |
| + * The write counter contains a pseudo-random number which is |
| + * regenerated every time we set the RTC so it should be a |
| + * useful per-system source of entropy. |
| + */ |
| + ret = wm831x_reg_read(wm831x, WM831X_RTC_WRITE_COUNTER); |
| + if (ret >= 0) { |
| + reg = ret; |
| + add_device_randomness(®, sizeof(reg)); |
| + } else { |
| + dev_warn(wm831x->dev, "Failed to read RTC write counter: %d\n", |
| + ret); |
| + } |
| +} |
| + |
| /* |
| * Read current time and date in RTC |
| */ |
| @@ -465,6 +485,8 @@ static int wm831x_rtc_probe(struct platform_device *pdev) |
| alm_irq, ret); |
| } |
| |
| + wm831x_rtc_add_randomness(wm831x); |
| + |
| return 0; |
| |
| err: |
| -- |
| 1.7.12.rc1.1.gbce1580 |
| |