]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ASoC: atmel_ssc_dai: make option to choose clock
authorBo Shen <voice.shen@atmel.com>
Mon, 10 Feb 2014 06:09:45 +0000 (14:09 +0800)
committerMark Brown <broonie@linaro.org>
Wed, 12 Feb 2014 17:21:22 +0000 (17:21 +0000)
When SSC works in slave mode, according to the hardware design, the
clock can get from TK pin, also can get from RK pin. So, add one
parameter to choose where the clock from.

Signed-off-by: Bo Shen <voice.shen@atmel.com>
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
drivers/misc/atmel-ssc.c
include/linux/atmel-ssc.h
sound/soc/atmel/atmel_ssc_dai.c

index 5be808406edcfc4bf08780647c86b322bddea9bb..22de13727641c76dcec8246244385a45d7907818 100644 (file)
@@ -150,6 +150,12 @@ static int ssc_probe(struct platform_device *pdev)
                return -ENODEV;
        ssc->pdata = (struct atmel_ssc_platform_data *)plat_dat;
 
+       if (pdev->dev.of_node) {
+               struct device_node *np = pdev->dev.of_node;
+               ssc->clk_from_rk_pin =
+                       of_property_read_bool(np, "atmel,clk-from-rk-pin");
+       }
+
        regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        ssc->regs = devm_ioremap_resource(&pdev->dev, regs);
        if (IS_ERR(ssc->regs))
index 66a0e5384edd6090ae3793082c8a4f56fb6ea74d..571a12ebb018da65d40068e72232031865b67145 100644 (file)
@@ -18,6 +18,7 @@ struct ssc_device {
        struct clk              *clk;
        int                     user;
        int                     irq;
+       bool                    clk_from_rk_pin;
 };
 
 struct ssc_device * __must_check ssc_request(unsigned int ssc_num);
index 1ead3c977a51743619b0bb2084ec174b7cf867a8..de433cfd044ce2c2ce6599766e4d7cedef5798b3 100644 (file)
@@ -341,6 +341,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
 {
        int id = dai->id;
        struct atmel_ssc_info *ssc_p = &ssc_info[id];
+       struct ssc_device *ssc = ssc_p->ssc;
        struct atmel_pcm_dma_params *dma_params;
        int dir, channels, bits;
        u32 tfmr, rfmr, tcmr, rcmr;
@@ -466,7 +467,8 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
                        | SSC_BF(RCMR_START, start_event)
                        | SSC_BF(RCMR_CKI, SSC_CKI_RISING)
                        | SSC_BF(RCMR_CKO, SSC_CKO_NONE)
-                       | SSC_BF(RCMR_CKS, SSC_CKS_CLOCK);
+                       | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ?
+                                          SSC_CKS_PIN : SSC_CKS_CLOCK);
 
                rfmr =    SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
                        | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE)
@@ -481,7 +483,8 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
                        | SSC_BF(TCMR_START, start_event)
                        | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
                        | SSC_BF(TCMR_CKO, SSC_CKO_NONE)
-                       | SSC_BF(TCMR_CKS, SSC_CKS_PIN);
+                       | SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ?
+                                          SSC_CKS_CLOCK : SSC_CKS_PIN);
 
                tfmr =    SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
                        | SSC_BF(TFMR_FSDEN, 0)
@@ -550,7 +553,8 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
                        | SSC_BF(RCMR_START, SSC_START_RISING_RF)
                        | SSC_BF(RCMR_CKI, SSC_CKI_RISING)
                        | SSC_BF(RCMR_CKO, SSC_CKO_NONE)
-                       | SSC_BF(RCMR_CKS, SSC_CKS_PIN);
+                       | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ?
+                                          SSC_CKS_PIN : SSC_CKS_CLOCK);
 
                rfmr =    SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
                        | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE)
@@ -565,7 +569,8 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
                        | SSC_BF(TCMR_START, SSC_START_RISING_RF)
                        | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
                        | SSC_BF(TCMR_CKO, SSC_CKO_NONE)
-                       | SSC_BF(TCMR_CKS, SSC_CKS_PIN);
+                       | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ?
+                                          SSC_CKS_CLOCK : SSC_CKS_PIN);
 
                tfmr =    SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
                        | SSC_BF(TFMR_FSDEN, 0)