| From fddd729bd2150e83365528cefb9f1fef581e04c5 Mon Sep 17 00:00:00 2001 | 
 | From: Vakul Garg <vakul.garg@nxp.com> | 
 | Date: Sun, 6 Jan 2019 19:05:37 +0530 | 
 | Subject: [PATCH] fsl_qbman: Adjust platform device creation for QMan portals | 
 |  | 
 | Fix the platform device creation in QMan portals such that | 
 | dma mappings are done properly. | 
 |  | 
 | Signed-off-by: Vakul Garg <vakul.garg@nxp.com> | 
 | Signed-off-by: Roy Pledge <roy.pledge@nxp.com> | 
 | --- | 
 |  drivers/staging/fsl_qbman/qman_high.c | 47 +++++++++++++++++++---------------- | 
 |  1 file changed, 25 insertions(+), 22 deletions(-) | 
 |  | 
 | --- a/drivers/staging/fsl_qbman/qman_high.c | 
 | +++ b/drivers/staging/fsl_qbman/qman_high.c | 
 | @@ -575,6 +575,7 @@ struct qman_portal *qman_create_portal( | 
 |  	char buf[16]; | 
 |  	int ret; | 
 |  	u32 isdr; | 
 | +	struct platform_device_info pdev_info; | 
 |   | 
 |  	if (!portal) { | 
 |  		portal = kmalloc(sizeof(*portal), GFP_KERNEL); | 
 | @@ -671,27 +672,22 @@ struct qman_portal *qman_create_portal( | 
 |  	portal->dqrr_disable_ref = 0; | 
 |  	portal->cb_dc_ern = NULL; | 
 |  	sprintf(buf, "qportal-%d", config->public_cfg.channel); | 
 | -	portal->pdev = platform_device_alloc(buf, -1); | 
 | + | 
 | +	memset(&pdev_info, 0, sizeof(pdev_info)); | 
 | +	pdev_info.name = buf; | 
 | +	pdev_info.id = PLATFORM_DEVID_NONE; | 
 | +	pdev_info.dma_mask = DMA_BIT_MASK(40); | 
 | + | 
 | +	portal->pdev = platform_device_register_full(&pdev_info); | 
 |  	if (!portal->pdev) { | 
 |  		pr_err("qman_portal - platform_device_alloc() failed\n"); | 
 | -		goto fail_devalloc; | 
 | -	} | 
 | -#if defined(CONFIG_ARM) || defined(CONFIG_ARM64) | 
 | -	portal->pdev->dev.coherent_dma_mask = DMA_BIT_MASK(40); | 
 | -	portal->pdev->dev.dma_mask = &portal->pdev->dev.coherent_dma_mask; | 
 | -#else | 
 | -	if (dma_set_mask(&portal->pdev->dev, DMA_BIT_MASK(40))) { | 
 | -		pr_err("qman_portal - dma_set_mask() failed\n"); | 
 | -		goto fail_devadd; | 
 | +		goto fail_devregister; | 
 |  	} | 
 | -#endif | 
 | + | 
 | +	arch_setup_dma_ops(&portal->pdev->dev, 0, 0, NULL, true); | 
 | + | 
 |  	portal->pdev->dev.pm_domain = &qman_portal_device_pm_domain; | 
 |  	portal->pdev->dev.platform_data = portal; | 
 | -	ret = platform_device_add(portal->pdev); | 
 | -	if (ret) { | 
 | -		pr_err("qman_portal - platform_device_add() failed\n"); | 
 | -		goto fail_devadd; | 
 | -	} | 
 |  	dpa_rbtree_init(&portal->retire_table); | 
 |  	isdr = 0xffffffff; | 
 |  	qm_isr_disable_write(__p, isdr); | 
 | @@ -751,10 +747,8 @@ fail_eqcr_empty: | 
 |  fail_affinity: | 
 |  	free_irq(config->public_cfg.irq, portal); | 
 |  fail_irq: | 
 | -	platform_device_del(portal->pdev); | 
 | -fail_devadd: | 
 | -	platform_device_put(portal->pdev); | 
 | -fail_devalloc: | 
 | +	platform_device_unregister(portal->pdev); | 
 | +fail_devregister: | 
 |  	if (num_ceetms) | 
 |  		for (ret = 0; ret < num_ceetms; ret++) | 
 |  			kfree(portal->ccgrs[ret]); | 
 | @@ -852,8 +846,7 @@ void qman_destroy_portal(struct qman_por | 
 |  	qm_dqrr_finish(&qm->p); | 
 |  	qm_eqcr_finish(&qm->p); | 
 |   | 
 | -	platform_device_del(qm->pdev); | 
 | -	platform_device_put(qm->pdev); | 
 | +	platform_device_unregister(qm->pdev); | 
 |   | 
 |  	qm->config = NULL; | 
 |  	if (qm->alloced) | 
 | @@ -1809,6 +1802,16 @@ int qman_init_fq(struct qman_fq *fq, u32 | 
 |  		} else { | 
 |  			phys_fq = dma_map_single(&p->pdev->dev, fq, sizeof(*fq), | 
 |  						DMA_TO_DEVICE); | 
 | +			if (dma_mapping_error(&p->pdev->dev, phys_fq)) { | 
 | +				dev_err(&p->pdev->dev, | 
 | +					"dma_map_single failed for fqid: %u\n", | 
 | +					fq->fqid); | 
 | +				FQUNLOCK(fq); | 
 | +				PORTAL_IRQ_UNLOCK(p, irqflags); | 
 | +				put_affine_portal(); | 
 | +				return -EIO; | 
 | +			} | 
 | + | 
 |  			qm_fqd_stashing_set64(&mcc->initfq.fqd, phys_fq); | 
 |  		} | 
 |  	} |