···226226 To compile this driver as a module, choose M here: the227227 module will be called virtio-rng. If unsure, say N.228228229229-config HW_RANDOM_TX4939230230- tristate "TX4939 Random Number Generator support"231231- depends on SOC_TX4939232232- default HW_RANDOM233233- help234234- This driver provides kernel-side support for the Random Number235235- Generator hardware found on TX4939 SoC.236236-237237- To compile this driver as a module, choose M here: the238238- module will be called tx4939-rng.239239-240240- If unsure, say Y.241241-242229config HW_RANDOM_MXC_RNGA243230 tristate "Freescale i.MX RNGA Random Number Generator"244231 depends on SOC_IMX31
···11-/*22- * RNG driver for TX4939 Random Number Generators (RNG)33- *44- * Copyright (C) 2009 Atsushi Nemoto <anemo@mba.ocn.ne.jp>55- *66- * This file is subject to the terms and conditions of the GNU General Public77- * License. See the file "COPYING" in the main directory of this archive88- * for more details.99- */1010-#include <linux/err.h>1111-#include <linux/module.h>1212-#include <linux/kernel.h>1313-#include <linux/init.h>1414-#include <linux/delay.h>1515-#include <linux/io.h>1616-#include <linux/platform_device.h>1717-#include <linux/hw_random.h>1818-#include <linux/gfp.h>1919-2020-#define TX4939_RNG_RCSR 0x000000002121-#define TX4939_RNG_ROR(n) (0x00000018 + (n) * 8)2222-2323-#define TX4939_RNG_RCSR_INTE 0x000000082424-#define TX4939_RNG_RCSR_RST 0x000000042525-#define TX4939_RNG_RCSR_FIN 0x000000022626-#define TX4939_RNG_RCSR_ST 0x000000012727-2828-struct tx4939_rng {2929- struct hwrng rng;3030- void __iomem *base;3131- u64 databuf[3];3232- unsigned int data_avail;3333-};3434-3535-static void rng_io_start(void)3636-{3737-#ifndef CONFIG_64BIT3838- /*3939- * readq is reading a 64-bit register using a 64-bit load. On4040- * a 32-bit kernel however interrupts or any other processor4141- * exception would clobber the upper 32-bit of the processor4242- * register so interrupts need to be disabled.4343- */4444- local_irq_disable();4545-#endif4646-}4747-4848-static void rng_io_end(void)4949-{5050-#ifndef CONFIG_64BIT5151- local_irq_enable();5252-#endif5353-}5454-5555-static u64 read_rng(void __iomem *base, unsigned int offset)5656-{5757- return ____raw_readq(base + offset);5858-}5959-6060-static void write_rng(u64 val, void __iomem *base, unsigned int offset)6161-{6262- return ____raw_writeq(val, base + offset);6363-}6464-6565-static int tx4939_rng_data_present(struct hwrng *rng, int wait)6666-{6767- struct tx4939_rng *rngdev = container_of(rng, struct tx4939_rng, rng);6868- int i;6969-7070- if (rngdev->data_avail)7171- return rngdev->data_avail;7272- for (i = 0; i < 20; i++) {7373- rng_io_start();7474- if (!(read_rng(rngdev->base, TX4939_RNG_RCSR)7575- & TX4939_RNG_RCSR_ST)) {7676- rngdev->databuf[0] =7777- read_rng(rngdev->base, TX4939_RNG_ROR(0));7878- rngdev->databuf[1] =7979- read_rng(rngdev->base, TX4939_RNG_ROR(1));8080- rngdev->databuf[2] =8181- read_rng(rngdev->base, TX4939_RNG_ROR(2));8282- rngdev->data_avail =8383- sizeof(rngdev->databuf) / sizeof(u32);8484- /* Start RNG */8585- write_rng(TX4939_RNG_RCSR_ST,8686- rngdev->base, TX4939_RNG_RCSR);8787- wait = 0;8888- }8989- rng_io_end();9090- if (!wait)9191- break;9292- /* 90 bus clock cycles by default for generation */9393- ndelay(90 * 5);9494- }9595- return rngdev->data_avail;9696-}9797-9898-static int tx4939_rng_data_read(struct hwrng *rng, u32 *buffer)9999-{100100- struct tx4939_rng *rngdev = container_of(rng, struct tx4939_rng, rng);101101-102102- rngdev->data_avail--;103103- *buffer = *((u32 *)&rngdev->databuf + rngdev->data_avail);104104- return sizeof(u32);105105-}106106-107107-static int __init tx4939_rng_probe(struct platform_device *dev)108108-{109109- struct tx4939_rng *rngdev;110110- int i;111111-112112- rngdev = devm_kzalloc(&dev->dev, sizeof(*rngdev), GFP_KERNEL);113113- if (!rngdev)114114- return -ENOMEM;115115- rngdev->base = devm_platform_ioremap_resource(dev, 0);116116- if (IS_ERR(rngdev->base))117117- return PTR_ERR(rngdev->base);118118-119119- rngdev->rng.name = dev_name(&dev->dev);120120- rngdev->rng.data_present = tx4939_rng_data_present;121121- rngdev->rng.data_read = tx4939_rng_data_read;122122-123123- rng_io_start();124124- /* Reset RNG */125125- write_rng(TX4939_RNG_RCSR_RST, rngdev->base, TX4939_RNG_RCSR);126126- write_rng(0, rngdev->base, TX4939_RNG_RCSR);127127- /* Start RNG */128128- write_rng(TX4939_RNG_RCSR_ST, rngdev->base, TX4939_RNG_RCSR);129129- rng_io_end();130130- /*131131- * Drop first two results. From the datasheet:132132- * The quality of the random numbers generated immediately133133- * after reset can be insufficient. Therefore, do not use134134- * random numbers obtained from the first and second135135- * generations; use the ones from the third or subsequent136136- * generation.137137- */138138- for (i = 0; i < 2; i++) {139139- rngdev->data_avail = 0;140140- if (!tx4939_rng_data_present(&rngdev->rng, 1))141141- return -EIO;142142- }143143-144144- platform_set_drvdata(dev, rngdev);145145- return devm_hwrng_register(&dev->dev, &rngdev->rng);146146-}147147-148148-static struct platform_driver tx4939_rng_driver = {149149- .driver = {150150- .name = "tx4939-rng",151151- },152152-};153153-154154-module_platform_driver_probe(tx4939_rng_driver, tx4939_rng_probe);155155-156156-MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver for TX4939");157157-MODULE_LICENSE("GPL");
+1-1
drivers/mtd/nand/raw/Kconfig
···308308309309config MTD_NAND_TXX9NDFMC310310 tristate "TXx9 NAND controller"311311- depends on SOC_TX4938 || SOC_TX4939 || COMPILE_TEST311311+ depends on SOC_TX4938 || COMPILE_TEST312312 depends on HAS_IOMEM313313 help314314 This enables the NAND flash controller on the TXx9 SoCs.