mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6 into next
Pull crypto updates from Herbert Xu: "Here is the crypto update for 3.16: - Added test vectors for SHA/AES-CCM/DES-CBC/3DES-CBC. - Fixed a number of error-path memory leaks in tcrypt. - Fixed error-path memory leak in caam. - Removed unnecessary global mutex from mxs-dcp. - Added ahash walk interface that can actually be asynchronous. - Cleaned up caam error reporting. - Allow crypto_user get operation to be used by non-root users. - Add support for SSS module on Exynos. - Misc fixes" * git://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6: (60 commits) crypto: testmgr - add aead cbc des, des3_ede tests crypto: testmgr - Fix DMA-API warning crypto: cesa - tfm->__crt_alg->cra_type directly crypto: sahara - tfm->__crt_alg->cra_name directly crypto: padlock - tfm->__crt_alg->cra_name directly crypto: n2 - tfm->__crt_alg->cra_name directly crypto: dcp - tfm->__crt_alg->cra_name directly crypto: cesa - tfm->__crt_alg->cra_name directly crypto: ccp - tfm->__crt_alg->cra_name directly crypto: geode - Don't use tfm->__crt_alg->cra_name directly crypto: geode - Weed out printk() from probe() crypto: geode - Consistently use AES_KEYSIZE_128 crypto: geode - Kill AES_IV_LENGTH crypto: geode - Kill AES_MIN_BLOCK_SIZE crypto: mxs-dcp - Remove global mutex crypto: hash - Add real ahash walk interface hwrng: n2-drv - Introduce the use of the managed version of kzalloc crypto: caam - reinitialize keys_fit_inline for decrypt and givencrypt crypto: s5p-sss - fix multiplatform build hwrng: timeriomem - remove unnecessary OOM messages ...
This commit is contained in:
commit
639b4ac691
37 changed files with 2369 additions and 746 deletions
|
|
@ -2,7 +2,7 @@
|
|||
# Hardware Random Number Generator (RNG) configuration
|
||||
#
|
||||
|
||||
config HW_RANDOM
|
||||
menuconfig HW_RANDOM
|
||||
tristate "Hardware Random Number Generator Core support"
|
||||
default m
|
||||
---help---
|
||||
|
|
@ -20,9 +20,11 @@ config HW_RANDOM
|
|||
|
||||
If unsure, say Y.
|
||||
|
||||
if HW_RANDOM
|
||||
|
||||
config HW_RANDOM_TIMERIOMEM
|
||||
tristate "Timer IOMEM HW Random Number Generator support"
|
||||
depends on HW_RANDOM && HAS_IOMEM
|
||||
depends on HAS_IOMEM
|
||||
---help---
|
||||
This driver provides kernel-side support for a generic Random
|
||||
Number Generator used by reading a 'dumb' iomem address that
|
||||
|
|
@ -36,7 +38,7 @@ config HW_RANDOM_TIMERIOMEM
|
|||
|
||||
config HW_RANDOM_INTEL
|
||||
tristate "Intel HW Random Number Generator support"
|
||||
depends on HW_RANDOM && (X86 || IA64) && PCI
|
||||
depends on (X86 || IA64) && PCI
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -49,7 +51,7 @@ config HW_RANDOM_INTEL
|
|||
|
||||
config HW_RANDOM_AMD
|
||||
tristate "AMD HW Random Number Generator support"
|
||||
depends on HW_RANDOM && (X86 || PPC_MAPLE) && PCI
|
||||
depends on (X86 || PPC_MAPLE) && PCI
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -62,8 +64,8 @@ config HW_RANDOM_AMD
|
|||
|
||||
config HW_RANDOM_ATMEL
|
||||
tristate "Atmel Random Number Generator support"
|
||||
depends on HW_RANDOM && HAVE_CLK
|
||||
default (HW_RANDOM && ARCH_AT91)
|
||||
depends on ARCH_AT91 && HAVE_CLK
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on Atmel AT91 devices.
|
||||
|
|
@ -75,7 +77,7 @@ config HW_RANDOM_ATMEL
|
|||
|
||||
config HW_RANDOM_BCM63XX
|
||||
tristate "Broadcom BCM63xx Random Number Generator support"
|
||||
depends on HW_RANDOM && BCM63XX
|
||||
depends on BCM63XX
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -88,7 +90,7 @@ config HW_RANDOM_BCM63XX
|
|||
|
||||
config HW_RANDOM_BCM2835
|
||||
tristate "Broadcom BCM2835 Random Number Generator support"
|
||||
depends on HW_RANDOM && ARCH_BCM2835
|
||||
depends on ARCH_BCM2835
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -101,7 +103,7 @@ config HW_RANDOM_BCM2835
|
|||
|
||||
config HW_RANDOM_GEODE
|
||||
tristate "AMD Geode HW Random Number Generator support"
|
||||
depends on HW_RANDOM && X86_32 && PCI
|
||||
depends on X86_32 && PCI
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -114,7 +116,7 @@ config HW_RANDOM_GEODE
|
|||
|
||||
config HW_RANDOM_N2RNG
|
||||
tristate "Niagara2 Random Number Generator support"
|
||||
depends on HW_RANDOM && SPARC64
|
||||
depends on SPARC64
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -127,7 +129,7 @@ config HW_RANDOM_N2RNG
|
|||
|
||||
config HW_RANDOM_VIA
|
||||
tristate "VIA HW Random Number Generator support"
|
||||
depends on HW_RANDOM && X86
|
||||
depends on X86
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -140,7 +142,7 @@ config HW_RANDOM_VIA
|
|||
|
||||
config HW_RANDOM_IXP4XX
|
||||
tristate "Intel IXP4xx NPU HW Pseudo-Random Number Generator support"
|
||||
depends on HW_RANDOM && ARCH_IXP4XX
|
||||
depends on ARCH_IXP4XX
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Pseudo-Random
|
||||
|
|
@ -153,7 +155,7 @@ config HW_RANDOM_IXP4XX
|
|||
|
||||
config HW_RANDOM_OMAP
|
||||
tristate "OMAP Random Number Generator support"
|
||||
depends on HW_RANDOM && (ARCH_OMAP16XX || ARCH_OMAP2PLUS)
|
||||
depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -167,7 +169,7 @@ config HW_RANDOM_OMAP
|
|||
|
||||
config HW_RANDOM_OMAP3_ROM
|
||||
tristate "OMAP3 ROM Random Number Generator support"
|
||||
depends on HW_RANDOM && ARCH_OMAP3
|
||||
depends on ARCH_OMAP3
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -180,7 +182,7 @@ config HW_RANDOM_OMAP3_ROM
|
|||
|
||||
config HW_RANDOM_OCTEON
|
||||
tristate "Octeon Random Number Generator support"
|
||||
depends on HW_RANDOM && CAVIUM_OCTEON_SOC
|
||||
depends on CAVIUM_OCTEON_SOC
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -193,7 +195,7 @@ config HW_RANDOM_OCTEON
|
|||
|
||||
config HW_RANDOM_PASEMI
|
||||
tristate "PA Semi HW Random Number Generator support"
|
||||
depends on HW_RANDOM && PPC_PASEMI
|
||||
depends on PPC_PASEMI
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -206,7 +208,7 @@ config HW_RANDOM_PASEMI
|
|||
|
||||
config HW_RANDOM_VIRTIO
|
||||
tristate "VirtIO Random Number Generator support"
|
||||
depends on HW_RANDOM && VIRTIO
|
||||
depends on VIRTIO
|
||||
---help---
|
||||
This driver provides kernel-side support for the virtual Random Number
|
||||
Generator hardware.
|
||||
|
|
@ -216,7 +218,7 @@ config HW_RANDOM_VIRTIO
|
|||
|
||||
config HW_RANDOM_TX4939
|
||||
tristate "TX4939 Random Number Generator support"
|
||||
depends on HW_RANDOM && SOC_TX4939
|
||||
depends on SOC_TX4939
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
|
|
@ -229,7 +231,8 @@ config HW_RANDOM_TX4939
|
|||
|
||||
config HW_RANDOM_MXC_RNGA
|
||||
tristate "Freescale i.MX RNGA Random Number Generator"
|
||||
depends on HW_RANDOM && ARCH_HAS_RNGA
|
||||
depends on ARCH_HAS_RNGA
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on Freescale i.MX processors.
|
||||
|
|
@ -241,7 +244,8 @@ config HW_RANDOM_MXC_RNGA
|
|||
|
||||
config HW_RANDOM_NOMADIK
|
||||
tristate "ST-Ericsson Nomadik Random Number Generator support"
|
||||
depends on HW_RANDOM && ARCH_NOMADIK
|
||||
depends on ARCH_NOMADIK
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on ST-Ericsson SoCs (8815 and 8500).
|
||||
|
|
@ -251,21 +255,10 @@ config HW_RANDOM_NOMADIK
|
|||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_PICOXCELL
|
||||
tristate "Picochip picoXcell true random number generator support"
|
||||
depends on HW_RANDOM && ARCH_PICOXCELL && PICOXCELL_PC3X3
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on Picochip PC3x3 and later devices.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called picoxcell-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_PPC4XX
|
||||
tristate "PowerPC 4xx generic true random number generator support"
|
||||
depends on HW_RANDOM && PPC && 4xx
|
||||
depends on PPC && 4xx
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides the kernel-side support for the TRNG hardware
|
||||
found in the security function of some PowerPC 4xx SoCs.
|
||||
|
|
@ -275,6 +268,73 @@ config HW_RANDOM_PPC4XX
|
|||
|
||||
If unsure, say N.
|
||||
|
||||
config HW_RANDOM_PSERIES
|
||||
tristate "pSeries HW Random Number Generator support"
|
||||
depends on PPC64 && IBMVIO
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on POWER7+ machines and above
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called pseries-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_POWERNV
|
||||
tristate "PowerNV Random Number Generator support"
|
||||
depends on PPC_POWERNV
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This is the driver for Random Number Generator hardware found
|
||||
in POWER7+ and above machines for PowerNV platform.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called powernv-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_EXYNOS
|
||||
tristate "EXYNOS HW random number generator support"
|
||||
depends on ARCH_EXYNOS
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on EXYNOS SOCs.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called exynos-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_TPM
|
||||
tristate "TPM HW Random Number Generator support"
|
||||
depends on TCG_TPM
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator in the Trusted Platform Module
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called tpm-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_MSM
|
||||
tristate "Qualcomm SoCs Random Number Generator support"
|
||||
depends on HW_RANDOM && ARCH_QCOM
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on Qualcomm SoCs.
|
||||
|
||||
To compile this driver as a module, choose M here. the
|
||||
module will be called msm-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
endif # HW_RANDOM
|
||||
|
||||
config UML_RANDOM
|
||||
depends on UML
|
||||
tristate "Hardware random number generator"
|
||||
|
|
@ -289,66 +349,3 @@ config UML_RANDOM
|
|||
(check your distro, or download from
|
||||
http://sourceforge.net/projects/gkernel/). rngd periodically reads
|
||||
/dev/hwrng and injects the entropy into /dev/random.
|
||||
|
||||
config HW_RANDOM_PSERIES
|
||||
tristate "pSeries HW Random Number Generator support"
|
||||
depends on HW_RANDOM && PPC64 && IBMVIO
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on POWER7+ machines and above
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called pseries-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_POWERNV
|
||||
tristate "PowerNV Random Number Generator support"
|
||||
depends on HW_RANDOM && PPC_POWERNV
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This is the driver for Random Number Generator hardware found
|
||||
in POWER7+ and above machines for PowerNV platform.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called powernv-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_EXYNOS
|
||||
tristate "EXYNOS HW random number generator support"
|
||||
depends on HW_RANDOM && HAS_IOMEM && HAVE_CLK
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on EXYNOS SOCs.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called exynos-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_TPM
|
||||
tristate "TPM HW Random Number Generator support"
|
||||
depends on HW_RANDOM && TCG_TPM
|
||||
default HW_RANDOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator in the Trusted Platform Module
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called tpm-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config HW_RANDOM_MSM
|
||||
tristate "Qualcomm SoCs Random Number Generator support"
|
||||
depends on HW_RANDOM && ARCH_QCOM
|
||||
---help---
|
||||
This driver provides kernel-side support for the Random Number
|
||||
Generator hardware found on Qualcomm SoCs.
|
||||
|
||||
To compile this driver as a module, choose M here. the
|
||||
module will be called msm-rng.
|
||||
|
||||
If unsure, say Y.
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ obj-$(CONFIG_HW_RANDOM_TX4939) += tx4939-rng.o
|
|||
obj-$(CONFIG_HW_RANDOM_MXC_RNGA) += mxc-rnga.o
|
||||
obj-$(CONFIG_HW_RANDOM_OCTEON) += octeon-rng.o
|
||||
obj-$(CONFIG_HW_RANDOM_NOMADIK) += nomadik-rng.o
|
||||
obj-$(CONFIG_HW_RANDOM_PICOXCELL) += picoxcell-rng.o
|
||||
obj-$(CONFIG_HW_RANDOM_PPC4XX) += ppc4xx-rng.o
|
||||
obj-$(CONFIG_HW_RANDOM_PSERIES) += pseries-rng.o
|
||||
obj-$(CONFIG_HW_RANDOM_POWERNV) += powernv-rng.o
|
||||
|
|
|
|||
|
|
@ -632,7 +632,7 @@ static int n2rng_probe(struct platform_device *op)
|
|||
multi_capable = (match->data != NULL);
|
||||
|
||||
n2rng_driver_version();
|
||||
np = kzalloc(sizeof(*np), GFP_KERNEL);
|
||||
np = devm_kzalloc(&op->dev, sizeof(*np), GFP_KERNEL);
|
||||
if (!np)
|
||||
goto out;
|
||||
np->op = op;
|
||||
|
|
@ -653,7 +653,7 @@ static int n2rng_probe(struct platform_device *op)
|
|||
&np->hvapi_minor)) {
|
||||
dev_err(&op->dev, "Cannot register suitable "
|
||||
"HVAPI version.\n");
|
||||
goto out_free;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -676,15 +676,16 @@ static int n2rng_probe(struct platform_device *op)
|
|||
dev_info(&op->dev, "Registered RNG HVAPI major %lu minor %lu\n",
|
||||
np->hvapi_major, np->hvapi_minor);
|
||||
|
||||
np->units = kzalloc(sizeof(struct n2rng_unit) * np->num_units,
|
||||
GFP_KERNEL);
|
||||
np->units = devm_kzalloc(&op->dev,
|
||||
sizeof(struct n2rng_unit) * np->num_units,
|
||||
GFP_KERNEL);
|
||||
err = -ENOMEM;
|
||||
if (!np->units)
|
||||
goto out_hvapi_unregister;
|
||||
|
||||
err = n2rng_init_control(np);
|
||||
if (err)
|
||||
goto out_free_units;
|
||||
goto out_hvapi_unregister;
|
||||
|
||||
dev_info(&op->dev, "Found %s RNG, units: %d\n",
|
||||
((np->flags & N2RNG_FLAG_MULTI) ?
|
||||
|
|
@ -697,7 +698,7 @@ static int n2rng_probe(struct platform_device *op)
|
|||
|
||||
err = hwrng_register(&np->hwrng);
|
||||
if (err)
|
||||
goto out_free_units;
|
||||
goto out_hvapi_unregister;
|
||||
|
||||
platform_set_drvdata(op, np);
|
||||
|
||||
|
|
@ -705,15 +706,9 @@ static int n2rng_probe(struct platform_device *op)
|
|||
|
||||
return 0;
|
||||
|
||||
out_free_units:
|
||||
kfree(np->units);
|
||||
np->units = NULL;
|
||||
|
||||
out_hvapi_unregister:
|
||||
sun4v_hvapi_unregister(HV_GRP_RNG);
|
||||
|
||||
out_free:
|
||||
kfree(np);
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
|
@ -730,11 +725,6 @@ static int n2rng_remove(struct platform_device *op)
|
|||
|
||||
sun4v_hvapi_unregister(HV_GRP_RNG);
|
||||
|
||||
kfree(np->units);
|
||||
np->units = NULL;
|
||||
|
||||
kfree(np);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -369,10 +369,8 @@ static int omap_rng_probe(struct platform_device *pdev)
|
|||
int ret;
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(struct omap_rng_dev), GFP_KERNEL);
|
||||
if (!priv) {
|
||||
dev_err(&pdev->dev, "could not allocate memory\n");
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
};
|
||||
|
||||
omap_rng_ops.priv = (unsigned long)priv;
|
||||
platform_set_drvdata(pdev, priv);
|
||||
|
|
|
|||
|
|
@ -1,181 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2010-2011 Picochip Ltd., Jamie Iles
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* All enquiries to support@picochip.com
|
||||
*/
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/hw_random.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#define DATA_REG_OFFSET 0x0200
|
||||
#define CSR_REG_OFFSET 0x0278
|
||||
#define CSR_OUT_EMPTY_MASK (1 << 24)
|
||||
#define CSR_FAULT_MASK (1 << 1)
|
||||
#define TRNG_BLOCK_RESET_MASK (1 << 0)
|
||||
#define TAI_REG_OFFSET 0x0380
|
||||
|
||||
/*
|
||||
* The maximum amount of time in microseconds to spend waiting for data if the
|
||||
* core wants us to wait. The TRNG should generate 32 bits every 320ns so a
|
||||
* timeout of 20us seems reasonable. The TRNG does builtin tests of the data
|
||||
* for randomness so we can't always assume there is data present.
|
||||
*/
|
||||
#define PICO_TRNG_TIMEOUT 20
|
||||
|
||||
static void __iomem *rng_base;
|
||||
static struct clk *rng_clk;
|
||||
static struct device *rng_dev;
|
||||
|
||||
static inline u32 picoxcell_trng_read_csr(void)
|
||||
{
|
||||
return __raw_readl(rng_base + CSR_REG_OFFSET);
|
||||
}
|
||||
|
||||
static inline bool picoxcell_trng_is_empty(void)
|
||||
{
|
||||
return picoxcell_trng_read_csr() & CSR_OUT_EMPTY_MASK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Take the random number generator out of reset and make sure the interrupts
|
||||
* are masked. We shouldn't need to get large amounts of random bytes so just
|
||||
* poll the status register. The hardware generates 32 bits every 320ns so we
|
||||
* shouldn't have to wait long enough to warrant waiting for an IRQ.
|
||||
*/
|
||||
static void picoxcell_trng_start(void)
|
||||
{
|
||||
__raw_writel(0, rng_base + TAI_REG_OFFSET);
|
||||
__raw_writel(0, rng_base + CSR_REG_OFFSET);
|
||||
}
|
||||
|
||||
static void picoxcell_trng_reset(void)
|
||||
{
|
||||
__raw_writel(TRNG_BLOCK_RESET_MASK, rng_base + CSR_REG_OFFSET);
|
||||
__raw_writel(TRNG_BLOCK_RESET_MASK, rng_base + TAI_REG_OFFSET);
|
||||
picoxcell_trng_start();
|
||||
}
|
||||
|
||||
/*
|
||||
* Get some random data from the random number generator. The hw_random core
|
||||
* layer provides us with locking.
|
||||
*/
|
||||
static int picoxcell_trng_read(struct hwrng *rng, void *buf, size_t max,
|
||||
bool wait)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Wait for some data to become available. */
|
||||
for (i = 0; i < PICO_TRNG_TIMEOUT && picoxcell_trng_is_empty(); ++i) {
|
||||
if (!wait)
|
||||
return 0;
|
||||
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
if (picoxcell_trng_read_csr() & CSR_FAULT_MASK) {
|
||||
dev_err(rng_dev, "fault detected, resetting TRNG\n");
|
||||
picoxcell_trng_reset();
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (i == PICO_TRNG_TIMEOUT)
|
||||
return 0;
|
||||
|
||||
*(u32 *)buf = __raw_readl(rng_base + DATA_REG_OFFSET);
|
||||
return sizeof(u32);
|
||||
}
|
||||
|
||||
static struct hwrng picoxcell_trng = {
|
||||
.name = "picoxcell",
|
||||
.read = picoxcell_trng_read,
|
||||
};
|
||||
|
||||
static int picoxcell_trng_probe(struct platform_device *pdev)
|
||||
{
|
||||
int ret;
|
||||
struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
||||
rng_base = devm_ioremap_resource(&pdev->dev, mem);
|
||||
if (IS_ERR(rng_base))
|
||||
return PTR_ERR(rng_base);
|
||||
|
||||
rng_clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(rng_clk)) {
|
||||
dev_warn(&pdev->dev, "no clk\n");
|
||||
return PTR_ERR(rng_clk);
|
||||
}
|
||||
|
||||
ret = clk_enable(rng_clk);
|
||||
if (ret) {
|
||||
dev_warn(&pdev->dev, "unable to enable clk\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
picoxcell_trng_start();
|
||||
ret = hwrng_register(&picoxcell_trng);
|
||||
if (ret)
|
||||
goto err_register;
|
||||
|
||||
rng_dev = &pdev->dev;
|
||||
dev_info(&pdev->dev, "pixoxcell random number generator active\n");
|
||||
|
||||
return 0;
|
||||
|
||||
err_register:
|
||||
clk_disable(rng_clk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int picoxcell_trng_remove(struct platform_device *pdev)
|
||||
{
|
||||
hwrng_unregister(&picoxcell_trng);
|
||||
clk_disable(rng_clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int picoxcell_trng_suspend(struct device *dev)
|
||||
{
|
||||
clk_disable(rng_clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int picoxcell_trng_resume(struct device *dev)
|
||||
{
|
||||
return clk_enable(rng_clk);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops picoxcell_trng_pm_ops = {
|
||||
.suspend = picoxcell_trng_suspend,
|
||||
.resume = picoxcell_trng_resume,
|
||||
};
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
static struct platform_driver picoxcell_trng_driver = {
|
||||
.probe = picoxcell_trng_probe,
|
||||
.remove = picoxcell_trng_remove,
|
||||
.driver = {
|
||||
.name = "picoxcell-trng",
|
||||
.owner = THIS_MODULE,
|
||||
#ifdef CONFIG_PM
|
||||
.pm = &picoxcell_trng_pm_ops,
|
||||
#endif /* CONFIG_PM */
|
||||
},
|
||||
};
|
||||
|
||||
module_platform_driver(picoxcell_trng_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Jamie Iles");
|
||||
MODULE_DESCRIPTION("Picochip picoXcell TRNG driver");
|
||||
|
|
@ -120,10 +120,8 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
|
|||
/* Allocate memory for the device structure (and zero it) */
|
||||
priv = devm_kzalloc(&pdev->dev,
|
||||
sizeof(struct timeriomem_rng_private_data), GFP_KERNEL);
|
||||
if (!priv) {
|
||||
dev_err(&pdev->dev, "failed to allocate device structure.\n");
|
||||
if (!priv)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, priv);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue