Ignore:
Timestamp:
Apr 14, 2017, 9:41:36 PM (10 days ago)
Author:
brainslayer
Message:

kernel update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-4.9/sound/soc/sunxi/sun4i-i2s.c

    r31574 r31859  
    1515#include <linux/dmaengine.h>
    1616#include <linux/module.h>
     17#include <linux/of_device.h>
    1718#include <linux/platform_device.h>
    1819#include <linux/pm_runtime.h>
    1920#include <linux/regmap.h>
     21#include <linux/reset.h>
    2022
    2123#include <sound/dmaengine_pcm.h>
     
    9395        struct clk      *mod_clk;
    9496        struct regmap   *regmap;
     97        struct reset_control *rst;
    9598
    9699        struct snd_dmaengine_dai_dma_data       playback_dma_data;
     
    586589}
    587590
     591struct sun4i_i2s_quirks {
     592        bool has_reset;
     593};
     594
     595static const struct sun4i_i2s_quirks sun4i_a10_i2s_quirks = {
     596        .has_reset      = false,
     597};
     598
     599static const struct sun4i_i2s_quirks sun6i_a31_i2s_quirks = {
     600        .has_reset      = true,
     601};
     602
    588603static int sun4i_i2s_probe(struct platform_device *pdev)
    589604{
    590605        struct sun4i_i2s *i2s;
     606        const struct sun4i_i2s_quirks *quirks;
    591607        struct resource *res;
    592608        void __iomem *regs;
     
    607623                dev_err(&pdev->dev, "Can't retrieve our interrupt\n");
    608624                return irq;
     625        }
     626
     627        quirks = of_device_get_match_data(&pdev->dev);
     628        if (!quirks) {
     629                dev_err(&pdev->dev, "Failed to determine the quirks to use\n");
     630                return -ENODEV;
    609631        }
    610632
     
    627649                return PTR_ERR(i2s->mod_clk);
    628650        }
    629        
     651
     652        if (quirks->has_reset) {
     653                i2s->rst = devm_reset_control_get(&pdev->dev, NULL);
     654                if (IS_ERR(i2s->rst)) {
     655                        dev_err(&pdev->dev, "Failed to get reset control\n");
     656                        return PTR_ERR(i2s->rst);
     657                }
     658        }
     659
     660        if (!IS_ERR(i2s->rst)) {
     661                ret = reset_control_deassert(i2s->rst);
     662                if (ret) {
     663                        dev_err(&pdev->dev,
     664                                "Failed to deassert the reset control\n");
     665                        return -EINVAL;
     666                }
     667        }
     668
    630669        i2s->playback_dma_data.addr = res->start + SUN4I_I2S_FIFO_TX_REG;
    631670        i2s->playback_dma_data.maxburst = 4;
     
    659698err_pm_disable:
    660699        pm_runtime_disable(&pdev->dev);
     700        if (!IS_ERR(i2s->rst))
     701                reset_control_assert(i2s->rst);
    661702
    662703        return ret;
     
    665706static int sun4i_i2s_remove(struct platform_device *pdev)
    666707{
     708        struct sun4i_i2s *i2s = dev_get_drvdata(&pdev->dev);
     709
    667710        snd_dmaengine_pcm_unregister(&pdev->dev);
    668711
     
    671714                sun4i_i2s_runtime_suspend(&pdev->dev);
    672715
     716        if (!IS_ERR(i2s->rst))
     717                reset_control_assert(i2s->rst);
     718
    673719        return 0;
    674720}
    675721
    676722static const struct of_device_id sun4i_i2s_match[] = {
    677         { .compatible = "allwinner,sun4i-a10-i2s", },
     723        {
     724                .compatible = "allwinner,sun4i-a10-i2s",
     725                .data = &sun4i_a10_i2s_quirks,
     726        },
     727        {
     728                .compatible = "allwinner,sun6i-a31-i2s",
     729                .data = &sun6i_a31_i2s_quirks,
     730        },
    678731        {}
    679732};
Note: See TracChangeset for help on using the changeset viewer.