From c18bf00085048c2d373791c5a13e8bfa4b5f3321 Mon Sep 17 00:00:00 2001 From: Nicolin Chen Date: Wed, 25 Sep 2013 15:16:44 +0800 Subject: [PATCH] ENGR00280852-6 mxc: asrc: Use devtype instead of specific DT properties We can determine the IP version from DT compatible name to decide which clock map and channel bits should be used. Signed-off-by: Nicolin Chen --- arch/arm/boot/dts/imx6qdl.dtsi | 4 +- drivers/mxc/asrc/mxc_asrc.c | 72 +++++++++++++++++++++++----------- include/linux/mxc_asrc.h | 1 - 3 files changed, 50 insertions(+), 27 deletions(-) diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi index bf9c66244556..bd39293beb54 100644 --- a/arch/arm/boot/dts/imx6qdl.dtsi +++ b/arch/arm/boot/dts/imx6qdl.dtsi @@ -275,7 +275,7 @@ }; asrc: asrc@02034000 { - compatible = "fsl,imx6q-asrc"; + compatible = "fsl,imx53-asrc"; reg = <0x02034000 0x4000>; interrupts = <0 50 0x04>; clocks = <&clks 107>, <&clks 156>; @@ -284,8 +284,6 @@ <&sdma 20 20 1>, <&sdma 21 20 1>, <&sdma 22 20 1>; dma-names = "rxa", "rxb", "rxc", "txa", "txb", "txc"; - fsl,clk-map-version = <2>; - fsl,clk-channel-bits = <4>; status = "okay"; }; diff --git a/drivers/mxc/asrc/mxc_asrc.c b/drivers/mxc/asrc/mxc_asrc.c index 75a75f27900a..6f371b2a28ce 100644 --- a/drivers/mxc/asrc/mxc_asrc.c +++ b/drivers/mxc/asrc/mxc_asrc.c @@ -79,6 +79,38 @@ static unsigned char output_clk_map_v2[] = { static unsigned char *input_clk_map, *output_clk_map; +enum mxc_asrc_type { + IMX35_ASRC, + IMX53_ASRC, +}; + +static const struct platform_device_id mxc_asrc_devtype[] = { + { + .name = "imx35-asrc", + .driver_data = IMX35_ASRC, + }, { + .name = "imx53-asrc", + .driver_data = IMX53_ASRC, + }, { + /* sentinel */ + } +}; +MODULE_DEVICE_TABLE(platform, mxc_asrc_devtype); + +static const struct of_device_id fsl_asrc_ids[] = { + { + .compatible = "fsl,imx35-asrc", + .data = &mxc_asrc_devtype[IMX35_ASRC], + }, { + .compatible = "fsl,imx53-asrc", + .data = &mxc_asrc_devtype[IMX53_ASRC], + }, { + /* sentinel */ + } +}; +MODULE_DEVICE_TABLE(of, fsl_asrc_ids); + + /* Set ASRC_REG_ASRCNCR reg, only supporting one-pair setting at once */ static int asrc_set_channel_number(enum asrc_pair_index index, u32 val) { @@ -1737,7 +1769,9 @@ static struct regmap_config asrc_regmap_config = { static int mxc_asrc_probe(struct platform_device *pdev) { + const struct of_device_id *of_id = of_match_device(fsl_asrc_ids, &pdev->dev); struct device_node *np = pdev->dev.of_node; + enum mxc_asrc_type devtype; struct resource *res; void __iomem *regs; int ret; @@ -1750,6 +1784,13 @@ static int mxc_asrc_probe(struct platform_device *pdev) if (!asrc) return -ENOMEM; + if (of_id) { + const struct platform_device_id *id_entry = of_id->data; + devtype = id_entry->driver_data; + } else { + devtype = pdev->id_entry->driver_data; + } + asrc->dev = &pdev->dev; asrc->dev->coherent_dma_mask = DMA_BIT_MASK(32); @@ -1806,30 +1847,20 @@ static int mxc_asrc_probe(struct platform_device *pdev) return PTR_ERR(asrc->dma_clk); } - ret = of_property_read_u32_array(pdev->dev.of_node, - "fsl,clk-channel-bits", &asrc->channel_bits, 1); - if (ret) { - dev_err(&pdev->dev, "failed to get clk-channel-bits\n"); - return ret; - } - - ret = of_property_read_u32_array(pdev->dev.of_node, - "fsl,clk-map-version", &asrc->clk_map_ver, 1); - if (ret) { - dev_err(&pdev->dev, "failed to get clk-map-version\n"); - return ret; - } - - switch (asrc->clk_map_ver) { - case 1: + switch (devtype) { + case IMX35_ASRC: + asrc->channel_bits = 3; input_clk_map = input_clk_map_v1; output_clk_map = output_clk_map_v1; break; - case 2: - default: + case IMX53_ASRC: + asrc->channel_bits = 4; input_clk_map = input_clk_map_v2; output_clk_map = output_clk_map_v2; break; + default: + dev_err(&pdev->dev, "unsupported device type\n"); + return -EINVAL; } ret = misc_register(&asrc_miscdev); @@ -1864,11 +1895,6 @@ static int mxc_asrc_remove(struct platform_device *pdev) return 0; } -static const struct of_device_id fsl_asrc_ids[] = { - { .compatible = "fsl,imx6q-asrc", }, - {} -}; - static struct platform_driver mxc_asrc_driver = { .driver = { .name = "mxc_asrc", diff --git a/include/linux/mxc_asrc.h b/include/linux/mxc_asrc.h index 921a92822dce..b9faaa207fc5 100644 --- a/include/linux/mxc_asrc.h +++ b/include/linux/mxc_asrc.h @@ -354,7 +354,6 @@ struct asrc_data { unsigned long paddr; unsigned int channel_bits; int asrc_major; - int clk_map_ver; int irq; struct device *dev; }; -- 2.39.5