mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
ASoC: rockchip: pdm: Add support for path map
This patch adds property 'rockchip,path-map' for path mapping. e.g. "rockchip,path-map = <3 2 1 0>" means the mapping as follows: path0 <-- sdi3 path1 <-- sdi2 path2 <-- sdi1 path3 <-- sdi0 Change-Id: Ief7ef83cbcf8c57ee9dc07e49d70ea7e5da9e5cc Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
This commit is contained in:
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#define PDM_DMA_BURST_SIZE (8) /* size * width: 8*4 = 32 bytes */
|
#define PDM_DMA_BURST_SIZE (8) /* size * width: 8*4 = 32 bytes */
|
||||||
#define PDM_SIGNOFF_CLK_RATE (100000000)
|
#define PDM_SIGNOFF_CLK_RATE (100000000)
|
||||||
|
#define PDM_PATH_MAX (4)
|
||||||
|
|
||||||
enum rk_pdm_version {
|
enum rk_pdm_version {
|
||||||
RK_PDM_RK3229,
|
RK_PDM_RK3229,
|
||||||
@@ -548,6 +549,33 @@ static const struct of_device_id rockchip_pdm_match[] = {
|
|||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, rockchip_pdm_match);
|
MODULE_DEVICE_TABLE(of, rockchip_pdm_match);
|
||||||
|
|
||||||
|
static int rockchip_pdm_path_parse(struct rk_pdm_dev *pdm, struct device_node *node)
|
||||||
|
{
|
||||||
|
unsigned int path[PDM_PATH_MAX];
|
||||||
|
int cnt = 0, ret = 0, i = 0, val = 0, msk = 0;
|
||||||
|
|
||||||
|
cnt = of_count_phandle_with_args(node, "rockchip,path-map",
|
||||||
|
NULL);
|
||||||
|
if (cnt != PDM_PATH_MAX)
|
||||||
|
return cnt;
|
||||||
|
|
||||||
|
ret = of_property_read_u32_array(node, "rockchip,path-map",
|
||||||
|
path, cnt);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
for (i = 0; i < cnt; i++) {
|
||||||
|
if (path[i] >= PDM_PATH_MAX)
|
||||||
|
return -EINVAL;
|
||||||
|
msk |= PDM_PATH_MASK(i);
|
||||||
|
val |= PDM_PATH(i, path[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, msk, val);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int rockchip_pdm_probe(struct platform_device *pdev)
|
static int rockchip_pdm_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device_node *node = pdev->dev.of_node;
|
struct device_node *node = pdev->dev.of_node;
|
||||||
@@ -617,6 +645,11 @@ static int rockchip_pdm_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
rockchip_pdm_rxctrl(pdm, 0);
|
rockchip_pdm_rxctrl(pdm, 0);
|
||||||
|
|
||||||
|
ret = rockchip_pdm_path_parse(pdm, node);
|
||||||
|
if (ret != -ENOENT)
|
||||||
|
goto err_suspend;
|
||||||
|
|
||||||
if (of_property_read_bool(node, "rockchip,no-dmaengine"))
|
if (of_property_read_bool(node, "rockchip,no-dmaengine"))
|
||||||
return ret;
|
return ret;
|
||||||
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||||
|
|||||||
@@ -62,6 +62,9 @@
|
|||||||
#define PDM_FD_DENOMINATOR_MSK GENMASK(15, 0)
|
#define PDM_FD_DENOMINATOR_MSK GENMASK(15, 0)
|
||||||
|
|
||||||
/* PDM CLK CTRL */
|
/* PDM CLK CTRL */
|
||||||
|
#define PDM_PATH_SHIFT(x) (8 + (x) * 2)
|
||||||
|
#define PDM_PATH_MASK(x) (0x3 << PDM_PATH_SHIFT(x))
|
||||||
|
#define PDM_PATH(x, v) ((v) << PDM_PATH_SHIFT(x))
|
||||||
#define PDM_CLK_FD_RATIO_MSK BIT(6)
|
#define PDM_CLK_FD_RATIO_MSK BIT(6)
|
||||||
#define PDM_CLK_FD_RATIO_40 (0X0 << 6)
|
#define PDM_CLK_FD_RATIO_40 (0X0 << 6)
|
||||||
#define PDM_CLK_FD_RATIO_35 BIT(6)
|
#define PDM_CLK_FD_RATIO_35 BIT(6)
|
||||||
|
|||||||
Reference in New Issue
Block a user