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

Commit 64f72e76 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: usb_bam: Add Null check in connect_pipe()"

parents 7dd146b7 2c1414a0
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -438,6 +438,11 @@ static int connect_pipe(u8 idx, u32 *usb_pipe_idx)
		data_buf->size = pipe_connect->data_fifo_size;
		data_buf->base =
			ioremap(data_buf->phys_base, data_buf->size);
		if (!data_buf->base) {
			pr_err("%s: ioremap failed for data fifo\n", __func__);
			ret = -ENOMEM;
			goto disable_memclk;
		}
		memset(data_buf->base, 0, data_buf->size);

		desc_buf->phys_base =
@@ -446,6 +451,13 @@ static int connect_pipe(u8 idx, u32 *usb_pipe_idx)
		desc_buf->size = pipe_connect->desc_fifo_size;
		desc_buf->base =
			ioremap(desc_buf->phys_base, desc_buf->size);
		if (!desc_buf->base) {
			pr_err("%s: ioremap failed for descriptor fifo\n",
								__func__);
			iounmap(data_buf->base);
			ret = -ENOMEM;
			goto disable_memclk;
		}
		memset(desc_buf->base, 0, desc_buf->size);
		break;
	case SYSTEM_MEM:
@@ -457,6 +469,12 @@ static int connect_pipe(u8 idx, u32 *usb_pipe_idx)
			pipe_connect->data_fifo_size,
			&(data_buf->phys_base),
			0);
		if (!data_buf->base) {
			pr_err("%s: dma_alloc_coherent failed for data fifo\n",
								__func__);
			ret = -ENOMEM;
			goto disable_memclk;
		}
		memset(data_buf->base, 0, pipe_connect->data_fifo_size);

		desc_buf->size = pipe_connect->desc_fifo_size;
@@ -465,6 +483,15 @@ static int connect_pipe(u8 idx, u32 *usb_pipe_idx)
			pipe_connect->desc_fifo_size,
			&(desc_buf->phys_base),
			0);
		if (!desc_buf->base) {
			pr_err("%s: dma_alloc_coherent failed for desc fifo\n",
								__func__);
			dma_free_coherent(&ctx.usb_bam_pdev->dev,
			pipe_connect->data_fifo_size, data_buf->base,
			data_buf->phys_base);
			ret = -ENOMEM;
			goto disable_memclk;
		}
		memset(desc_buf->base, 0, pipe_connect->desc_fifo_size);
		break;
	default:
@@ -487,6 +514,14 @@ static int connect_pipe(u8 idx, u32 *usb_pipe_idx)

error:
	sps_disconnect(*pipe);
disable_memclk:
	if (pipe_connect->mem_type == USB_PRIVATE_MEM) {
		writel_relaxed(0x0, ctx.qscratch_ram1_reg);
		writel_relaxed(0x0, ctx.qscratch_ram1_reg +
					QSCRATCH_CGCTL_REG_OFFSET);
		clk_disable_unprepare(ctx.mem_clk);
		clk_disable_unprepare(ctx.mem_iface_clk);
	}
free_sps_endpoint:
	sps_free_endpoint(*pipe);
	return ret;