From b0f27cd9f094f11c23fc543abad0e8be4c8c9e8a Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Thu, 6 Sep 2018 12:17:11 +0530 Subject: [PATCH] soc: swr-mstr: add changes to support native playback For MCLK frequency switching to 11.2896 for native playback support, frameshape also needs to be changed accordingly. Add changes to support frameshape switch based on mclk frequency for given master. Change-Id: I0c4dd69b743f83b45eeed73f27ad10e878b9244b Signed-off-by: Laxminath Kasam --- include/soc/swr-wcd.h | 4 ++++ soc/swr-mstr-ctrl.c | 21 ++++++++++++++++++++- soc/swr-mstr-ctrl.h | 1 + 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/soc/swr-wcd.h b/include/soc/swr-wcd.h index 360815043709..75d0e6512267 100644 --- a/include/soc/swr-wcd.h +++ b/include/soc/swr-wcd.h @@ -23,6 +23,7 @@ enum { SWR_DEVICE_UP, SWR_SUBSYS_RESTART, SWR_SET_NUM_RX_CH, + SWR_CLK_FREQ, }; struct swr_mstr_port { @@ -30,6 +31,9 @@ struct swr_mstr_port { u8 *port; }; +#define MCLK_FREQ 9600000 +#define MCLK_FREQ_NATIVE 11289600 + #if (IS_ENABLED(CONFIG_SOUNDWIRE_WCD_CTRL) || \ IS_ENABLED(CONFIG_SOUNDWIRE_MSTR_CTRL)) extern int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data); diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c index 26cc1f45d9f5..d3fb08769850 100644 --- a/soc/swr-mstr-ctrl.c +++ b/soc/swr-mstr-ctrl.c @@ -956,7 +956,15 @@ static int swrm_slvdev_datapath_control(struct swr_master *master, bool enable) n_col = SWR_MAX_COL; } /* Use default 50 * x, frame shape. Change based on mclk */ - n_row = SWR_ROW_50; + if (swrm->mclk_freq == MCLK_FREQ_NATIVE) { + dev_dbg(swrm->dev, "setting 64 x %d frameshape\n", + n_col ? 16 : 2); + n_row = SWR_ROW_64; + } else { + dev_dbg(swrm->dev, "setting 50 x %d frameshape\n", + n_col ? 16 : 2); + n_row = SWR_ROW_50; + } value = swr_master_read(swrm, SWRM_MCP_FRAME_CTRL_BANK_ADDR(bank)); value &= (~mask); value |= ((n_row << SWRM_MCP_FRAME_CTRL_BANK_ROW_CTRL_SHFT) | @@ -1630,6 +1638,7 @@ static int swrm_probe(struct platform_device *pdev) swrm->slave_status = 0; swrm->num_rx_chs = 0; swrm->clk_ref_count = 0; + swrm->mclk_freq = MCLK_FREQ; swrm->state = SWR_MSTR_RESUME; init_completion(&swrm->reset); init_completion(&swrm->broadcast); @@ -1940,6 +1949,16 @@ int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data) mstr = &swrm->master; switch (id) { + case SWR_CLK_FREQ: + if (!data) { + dev_err(swrm->dev, "%s: data is NULL\n", __func__); + ret = -EINVAL; + } else { + mutex_lock(&swrm->mlock); + swrm->mclk_freq = *(int *)data; + mutex_unlock(&swrm->mlock); + } + break; case SWR_DEVICE_DOWN: dev_dbg(swrm->dev, "%s: swr master down called\n", __func__); mutex_lock(&swrm->mlock); diff --git a/soc/swr-mstr-ctrl.h b/soc/swr-mstr-ctrl.h index fd133928593c..b3dfd7d3a3d1 100644 --- a/soc/swr-mstr-ctrl.h +++ b/soc/swr-mstr-ctrl.h @@ -129,6 +129,7 @@ struct swr_mstr_ctrl { void *data), void *swr_handle, int type); int irq; int version; + int mclk_freq; u32 num_dev; int slave_status; struct swrm_mports mport_cfg[SWR_MAX_MSTR_PORT_NUM];