Lines Matching +full:n900 +full:- +full:rom +full:- +full:rng
2 * omap3-rom-rng.c - RNG driver for TI OMAP3 CPU family
37 static int omap3_rom_rng_read(struct hwrng *rng, void *data, size_t max, bool w) in omap3_rom_rng_read() argument
43 ddata = (struct omap_rom_rng *)rng->priv; in omap3_rom_rng_read()
45 r = pm_runtime_get_sync(ddata->dev); in omap3_rom_rng_read()
47 pm_runtime_put_noidle(ddata->dev); in omap3_rom_rng_read()
53 r = ddata->rom_rng_call(ptr, 4, RNG_GEN_HW); in omap3_rom_rng_read()
55 r = -EINVAL; in omap3_rom_rng_read()
59 pm_runtime_mark_last_busy(ddata->dev); in omap3_rom_rng_read()
60 pm_runtime_put_autosuspend(ddata->dev); in omap3_rom_rng_read()
72 r = ddata->rom_rng_call(0, 0, RNG_RESET); in omap_rom_rng_runtime_suspend()
76 clk_disable_unprepare(ddata->clk); in omap_rom_rng_runtime_suspend()
88 r = clk_prepare_enable(ddata->clk); in omap_rom_rng_runtime_resume()
92 r = ddata->rom_rng_call(0, 0, RNG_GEN_PRNG_HW_INIT); in omap_rom_rng_runtime_resume()
94 clk_disable_unprepare(ddata->clk); in omap_rom_rng_runtime_resume()
97 return -EIO; in omap_rom_rng_runtime_resume()
107 pm_runtime_dont_use_autosuspend(ddata->dev); in omap_rom_rng_finish()
108 pm_runtime_disable(ddata->dev); in omap_rom_rng_finish()
116 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); in omap3_rom_rng_probe()
118 return -ENOMEM; in omap3_rom_rng_probe()
120 ddata->dev = &pdev->dev; in omap3_rom_rng_probe()
121 ddata->ops.priv = (unsigned long)ddata; in omap3_rom_rng_probe()
122 ddata->ops.name = "omap3-rom"; in omap3_rom_rng_probe()
123 ddata->ops.read = of_device_get_match_data(&pdev->dev); in omap3_rom_rng_probe()
124 ddata->ops.quality = 900; in omap3_rom_rng_probe()
125 if (!ddata->ops.read) { in omap3_rom_rng_probe()
126 dev_err(&pdev->dev, "missing rom code handler\n"); in omap3_rom_rng_probe()
128 return -ENODEV; in omap3_rom_rng_probe()
130 dev_set_drvdata(ddata->dev, ddata); in omap3_rom_rng_probe()
132 ddata->rom_rng_call = pdev->dev.platform_data; in omap3_rom_rng_probe()
133 if (!ddata->rom_rng_call) { in omap3_rom_rng_probe()
134 dev_err(ddata->dev, "rom_rng_call is NULL\n"); in omap3_rom_rng_probe()
135 return -EINVAL; in omap3_rom_rng_probe()
138 ddata->clk = devm_clk_get(ddata->dev, "ick"); in omap3_rom_rng_probe()
139 if (IS_ERR(ddata->clk)) { in omap3_rom_rng_probe()
140 dev_err(ddata->dev, "unable to get RNG clock\n"); in omap3_rom_rng_probe()
141 return PTR_ERR(ddata->clk); in omap3_rom_rng_probe()
144 pm_runtime_enable(&pdev->dev); in omap3_rom_rng_probe()
145 pm_runtime_set_autosuspend_delay(&pdev->dev, 500); in omap3_rom_rng_probe()
146 pm_runtime_use_autosuspend(&pdev->dev); in omap3_rom_rng_probe()
148 ret = devm_add_action_or_reset(ddata->dev, omap_rom_rng_finish, in omap3_rom_rng_probe()
153 return devm_hwrng_register(ddata->dev, &ddata->ops); in omap3_rom_rng_probe()
157 { .compatible = "nokia,n900-rom-rng", .data = omap3_rom_rng_read, },
169 .name = "omap3-rom-rng",
178 MODULE_ALIAS("platform:omap3-rom-rng");
181 MODULE_DESCRIPTION("RNG driver for TI OMAP3 CPU family");