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

Commit b797291c authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "Soc: soundwire: Update hw_ctl on HCLK at bootup"

parents 6c188e55 d941fe25
Loading
Loading
Loading
Loading
+36 −14
Original line number Diff line number Diff line
@@ -2237,7 +2237,7 @@ static void swrm_device_wakeup_unvote(struct swr_master *mstr)

static int swrm_master_init(struct swr_mstr_ctrl *swrm)
{
	int ret = 0;
	int ret = 0, i = 0;
	u32 val;
	u8 row_ctrl = SWR_ROW_50;
	u8 col_ctrl = SWR_MIN_COL;
@@ -2248,6 +2248,18 @@ static int swrm_master_init(struct swr_mstr_ctrl *swrm)
	u32 temp = 0;
	int len = 0;

	/* SW workaround to gate hw_ctl for SWR version >=1.6 */
	if (swrm->version >= SWRM_VERSION_1_6) {
		if (swrm->swrm_hctl_reg) {
			temp = ioread32(swrm->swrm_hctl_reg);
			temp &= 0xFFFFFFFD;
			iowrite32(temp, swrm->swrm_hctl_reg);
			usleep_range(500, 505);
			temp = ioread32(swrm->swrm_hctl_reg);
			dev_dbg(swrm->dev, "%s: hctl_reg val: 0x%x\n",
				__func__, temp);
		}
	}
	ssp_period = swrm_get_ssp_period(swrm, SWRM_ROW_50,
					SWRM_COL_02, SWRM_FRAME_SYNC_SEL);
	dev_dbg(swrm->dev, "%s: ssp_period: %d\n", __func__, ssp_period);
@@ -2303,6 +2315,13 @@ static int swrm_master_init(struct swr_mstr_ctrl *swrm)
		dev_err(swrm->dev,
			"%s: swr link failed to connect\n",
			__func__);
		for (i = 0; i < len; i++) {
			usleep_range(50, 55);
			dev_err(swrm->dev,
				"%s:reg:0x%x val:0x%x\n",
				__func__,
				reg[i], swr_master_read(swrm, reg[i]));
		}
		return -EINVAL;
	}

@@ -2312,14 +2331,6 @@ static int swrm_master_init(struct swr_mstr_ctrl *swrm)
				(swr_master_read(swrm,
					SWRM_CMD_FIFO_CFG) | 0x80000000));

	/* SW workaround to gate hw_ctl for SWR version >=1.6 */
	if (swrm->version >= SWRM_VERSION_1_6) {
		if (swrm->swrm_hctl_reg) {
			temp = ioread32(swrm->swrm_hctl_reg);
			temp &= 0xFFFFFFFD;
			iowrite32(temp, swrm->swrm_hctl_reg);
		}
	}
	return ret;
}

@@ -2659,6 +2670,7 @@ static int swrm_probe(struct platform_device *pdev)
			"%s: Error in master Initialization , err %d\n",
			__func__, ret);
		mutex_unlock(&swrm->mlock);
		ret = -EPROBE_DEFER;
		goto err_mstr_init_fail;
	}

@@ -2707,11 +2719,17 @@ static int swrm_probe(struct platform_device *pdev)
err_mstr_init_fail:
	swr_unregister_master(&swrm->master);
err_mstr_fail:
	if (swrm->reg_irq)
	if (swrm->reg_irq) {
		swrm->reg_irq(swrm->handle, swr_mstr_interrupt,
				swrm, SWR_IRQ_FREE);
	else if (swrm->irq)
	} else if (swrm->irq) {
		free_irq(swrm->irq, swrm);
		irqd_set_trigger_type(
			irq_get_irq_data(swrm->irq),
			IRQ_TYPE_NONE);
	}
	if (swrm->swr_irq_wakeup_capable)
		irq_set_irq_wake(swrm->irq, 0);
err_irq_fail:
	mutex_destroy(&swrm->irq_lock);
	mutex_destroy(&swrm->mlock);
@@ -2731,13 +2749,17 @@ static int swrm_remove(struct platform_device *pdev)
{
	struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);

	if (swrm->reg_irq)
	if (swrm->reg_irq) {
		swrm->reg_irq(swrm->handle, swr_mstr_interrupt,
				swrm, SWR_IRQ_FREE);
	else if (swrm->irq)
	} else if (swrm->irq) {
		free_irq(swrm->irq, swrm);
	else if (swrm->wake_irq > 0)
		irqd_set_trigger_type(
			irq_get_irq_data(swrm->irq),
			IRQ_TYPE_NONE);
	} else if (swrm->wake_irq > 0) {
		free_irq(swrm->wake_irq, swrm);
	}
	if (swrm->swr_irq_wakeup_capable)
		irq_set_irq_wake(swrm->irq, 0);
	cancel_work_sync(&swrm->wakeup_work);