]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - drivers/iio/adc/stm32-dfsdm-core.c
Merge branches 'x86/amd', 'x86/vt-d', 'arm/rockchip', 'arm/omap', 'arm/mediatek'...
[mirror_ubuntu-hirsute-kernel.git] / drivers / iio / adc / stm32-dfsdm-core.c
index 6cd655f8239b635cd5f0bb054de9938b9dc70848..e50efdcc41ff38c04b87c31c20d4e5c8f542deac 100644 (file)
@@ -83,7 +83,7 @@ int stm32_dfsdm_start_dfsdm(struct stm32_dfsdm *dfsdm)
 {
        struct dfsdm_priv *priv = container_of(dfsdm, struct dfsdm_priv, dfsdm);
        struct device *dev = &priv->pdev->dev;
-       unsigned int clk_div = priv->spi_clk_out_div;
+       unsigned int clk_div = priv->spi_clk_out_div, clk_src;
        int ret;
 
        if (atomic_inc_return(&priv->n_active_ch) == 1) {
@@ -100,6 +100,14 @@ int stm32_dfsdm_start_dfsdm(struct stm32_dfsdm *dfsdm)
                        }
                }
 
+               /* select clock source, e.g. 0 for "dfsdm" or 1 for "audio" */
+               clk_src = priv->aclk ? 1 : 0;
+               ret = regmap_update_bits(dfsdm->regmap, DFSDM_CHCFGR1(0),
+                                        DFSDM_CHCFGR1_CKOUTSRC_MASK,
+                                        DFSDM_CHCFGR1_CKOUTSRC(clk_src));
+               if (ret < 0)
+                       goto disable_aclk;
+
                /* Output the SPI CLKOUT (if clk_div == 0 clock if OFF) */
                ret = regmap_update_bits(dfsdm->regmap, DFSDM_CHCFGR1(0),
                                         DFSDM_CHCFGR1_CKOUTDIV_MASK,
@@ -242,7 +250,6 @@ MODULE_DEVICE_TABLE(of, stm32_dfsdm_of_match);
 static int stm32_dfsdm_probe(struct platform_device *pdev)
 {
        struct dfsdm_priv *priv;
-       const struct of_device_id *of_id;
        const struct stm32_dfsdm_dev_data *dev_data;
        struct stm32_dfsdm *dfsdm;
        int ret;
@@ -253,13 +260,8 @@ static int stm32_dfsdm_probe(struct platform_device *pdev)
 
        priv->pdev = pdev;
 
-       of_id = of_match_node(stm32_dfsdm_of_match, pdev->dev.of_node);
-       if (!of_id->data) {
-               dev_err(&pdev->dev, "Data associated to device is missing\n");
-               return -EINVAL;
-       }
+       dev_data = of_device_get_match_data(&pdev->dev);
 
-       dev_data = (const struct stm32_dfsdm_dev_data *)of_id->data;
        dfsdm = &priv->dfsdm;
        dfsdm->fl_list = devm_kcalloc(&pdev->dev, dev_data->num_filters,
                                      sizeof(*dfsdm->fl_list), GFP_KERNEL);
@@ -280,7 +282,7 @@ static int stm32_dfsdm_probe(struct platform_device *pdev)
 
        dfsdm->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "dfsdm",
                                                  dfsdm->base,
-                                                 &stm32h7_dfsdm_regmap_cfg);
+                                                 dev_data->regmap_cfg);
        if (IS_ERR(dfsdm->regmap)) {
                ret = PTR_ERR(dfsdm->regmap);
                dev_err(&pdev->dev, "%s: Failed to allocate regmap: %d\n",