mfd: Use AB3100 MFD core IRQ for interrupt randomness
authorLinus Walleij <linus.walleij@stericsson.com>
Tue, 19 Jan 2010 10:41:52 +0000 (11:41 +0100)
committerSamuel Ortiz <sameo@linux.intel.com>
Sun, 7 Mar 2010 21:17:10 +0000 (22:17 +0100)
This reintroduces the entropy sampling of the AB3100 IRQ as the
IRQF_SAMPLE_RANDOM is going out according to the feature removal
schedule. I'm trying to do this the right way then, so CC:ing some
random people for a quick review. We add entropy for interrupt
events in the AB3100 which are truly random in nature, like
external cables being connected, voltages on batteries dropping
below certain ranges, ADC triggers or overheating.

Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
Cc: Robin Getz <rgetz@blackfin.uclinux.org>
Acked-by: Matt Mackall <mpm@selenic.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
drivers/mfd/Kconfig
drivers/mfd/ab3100-core.c

index 9bcd447e71e2ee891aef6bd526b9da6934335cb1..ea2557bb0bd4d8cd19646c0212c627954707cd99 100644 (file)
@@ -329,8 +329,8 @@ config PCF50633_GPIO
         the PCF50633 chip.
 
 config AB3100_CORE
-       tristate "ST-Ericsson AB3100 Mixed Signal Circuit core functions"
-       depends on I2C
+       bool "ST-Ericsson AB3100 Mixed Signal Circuit core functions"
+       depends on I2C=y
        default y if ARCH_U300
        help
          Select this to enable the AB3100 Mixed Signal IC core
index aa3824a1b4f2683c0c1b0488e644ee2a13d087b9..a2ce3b6af4a21855651055202456772ae21c6900 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2009 ST-Ericsson
+ * Copyright (C) 2007-2010 ST-Ericsson
  * License terms: GNU General Public License (GPL) version 2
  * Low-level core for exclusive access to the AB3100 IC on the I2C bus
  * and some basic chip-configuration.
@@ -14,6 +14,7 @@
 #include <linux/platform_device.h>
 #include <linux/device.h>
 #include <linux/interrupt.h>
+#include <linux/random.h>
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
 #include <linux/uaccess.h>
@@ -376,6 +377,8 @@ static irqreturn_t ab3100_irq_handler(int irq, void *data)
        u32 fatevent;
        int err;
 
+       add_interrupt_randomness(irq);
+
        err = ab3100_get_register_page_interruptible(ab3100, AB3100_EVENTA1,
                                       event_regs, 3);
        if (err)
@@ -720,10 +723,7 @@ static struct platform_device ab3100_##devname##_device = {        \
        .id             = -1,                                   \
 }
 
-/*
- * This lists all the subdevices and corresponding register
- * ranges.
- */
+/* This lists all the subdevices */
 AB3100_DEVICE(dac, "ab3100-dac");
 AB3100_DEVICE(leds, "ab3100-leds");
 AB3100_DEVICE(power, "ab3100-power");
@@ -889,10 +889,11 @@ static int __init ab3100_probe(struct i2c_client *client,
        if (err)
                goto exit_no_setup;
 
-       /* This real unpredictable IRQ is of course sampled for entropy */
        err = request_threaded_irq(client->irq, NULL, ab3100_irq_handler,
-                         IRQF_ONESHOT,
-                         "ab3100-core", ab3100);
+                               IRQF_ONESHOT, "ab3100-core", ab3100);
+       /* This real unpredictable IRQ is of course sampled for entropy */
+       rand_initialize_irq(client->irq);
+
        if (err)
                goto exit_no_irq;