Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 084935b2 authored by Gary R Hook's avatar Gary R Hook Committed by Herbert Xu
Browse files

crypto: ccp - Add support for the RNG in a version 5 CCP

parent 4b394a23
Loading
Loading
Loading
Loading
+4 −9
Original line number Diff line number Diff line
@@ -432,14 +432,9 @@ static int ccp_init(struct ccp_device *ccp)
	dev_dbg(dev, "Registering device...\n");
	ccp_add_device(ccp);

	/* Register the RNG */
	ccp->hwrng.name = ccp->rngname;
	ccp->hwrng.read = ccp_trng_read;
	ret = hwrng_register(&ccp->hwrng);
	if (ret) {
		dev_err(dev, "error registering hwrng (%d)\n", ret);
	ret = ccp_register_rng(ccp);
	if (ret)
		goto e_kthread;
	}

	/* Register the DMA engine support */
	ret = ccp_dmaengine_register(ccp);
@@ -449,7 +444,7 @@ static int ccp_init(struct ccp_device *ccp)
	return 0;

e_hwrng:
	hwrng_unregister(&ccp->hwrng);
	ccp_unregister_rng(ccp);

e_kthread:
	for (i = 0; i < ccp->cmd_q_count; i++)
@@ -475,7 +470,7 @@ static void ccp_destroy(struct ccp_device *ccp)
	ccp_dmaengine_unregister(ccp);

	/* Unregister the RNG */
	hwrng_unregister(&ccp->hwrng);
	ccp_unregister_rng(ccp);

	/* Remove this device from the list of available units */
	ccp_del_device(ccp);
+7 −0
Original line number Diff line number Diff line
@@ -828,6 +828,10 @@ static int ccp5_init(struct ccp_device *ccp)
	/* Put this on the unit list to make it available */
	ccp_add_device(ccp);

	ret = ccp_register_rng(ccp);
	if (ret)
		goto e_kthread;

	return 0;

e_kthread:
@@ -852,6 +856,9 @@ static void ccp5_destroy(struct ccp_device *ccp)
	struct ccp_cmd *cmd;
	unsigned int i;

	/* Unregister the RNG */
	ccp_unregister_rng(ccp);

	/* Remove this device from the list of available units first */
	ccp_del_device(ccp);

+23 −0
Original line number Diff line number Diff line
@@ -119,6 +119,29 @@ void ccp_del_device(struct ccp_device *ccp)
	write_unlock_irqrestore(&ccp_unit_lock, flags);
}



int ccp_register_rng(struct ccp_device *ccp)
{
	int ret = 0;

	dev_dbg(ccp->dev, "Registering RNG...\n");
	/* Register an RNG */
	ccp->hwrng.name = ccp->rngname;
	ccp->hwrng.read = ccp_trng_read;
	ret = hwrng_register(&ccp->hwrng);
	if (ret)
		dev_err(ccp->dev, "error registering hwrng (%d)\n", ret);

	return ret;
}

void ccp_unregister_rng(struct ccp_device *ccp)
{
	if (ccp->hwrng.name)
		hwrng_unregister(&ccp->hwrng);
}

static struct ccp_device *ccp_get_device(void)
{
	unsigned long flags;
+2 −0
Original line number Diff line number Diff line
@@ -601,6 +601,8 @@ int ccp_trng_read(struct hwrng *rng, void *data, size_t max, bool wait);

int ccp_run_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd);

int ccp_register_rng(struct ccp_device *ccp);
void ccp_unregister_rng(struct ccp_device *ccp);
int ccp_dmaengine_register(struct ccp_device *ccp);
void ccp_dmaengine_unregister(struct ccp_device *ccp);