Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: atmel_ssc_dai: make option to choose clock

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>

authored by

Bo Shen and committed by
Mark Brown
048d4ff8 38dbfb59

+16 -4
+6
drivers/misc/atmel-ssc.c
··· 150 150 return -ENODEV; 151 151 ssc->pdata = (struct atmel_ssc_platform_data *)plat_dat; 152 152 153 + if (pdev->dev.of_node) { 154 + struct device_node *np = pdev->dev.of_node; 155 + ssc->clk_from_rk_pin = 156 + of_property_read_bool(np, "atmel,clk-from-rk-pin"); 157 + } 158 + 153 159 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); 154 160 ssc->regs = devm_ioremap_resource(&pdev->dev, regs); 155 161 if (IS_ERR(ssc->regs))
+1
include/linux/atmel-ssc.h
··· 18 18 struct clk *clk; 19 19 int user; 20 20 int irq; 21 + bool clk_from_rk_pin; 21 22 }; 22 23 23 24 struct ssc_device * __must_check ssc_request(unsigned int ssc_num);
+9 -4
sound/soc/atmel/atmel_ssc_dai.c
··· 341 341 { 342 342 int id = dai->id; 343 343 struct atmel_ssc_info *ssc_p = &ssc_info[id]; 344 + struct ssc_device *ssc = ssc_p->ssc; 344 345 struct atmel_pcm_dma_params *dma_params; 345 346 int dir, channels, bits; 346 347 u32 tfmr, rfmr, tcmr, rcmr; ··· 467 466 | SSC_BF(RCMR_START, start_event) 468 467 | SSC_BF(RCMR_CKI, SSC_CKI_RISING) 469 468 | SSC_BF(RCMR_CKO, SSC_CKO_NONE) 470 - | SSC_BF(RCMR_CKS, SSC_CKS_CLOCK); 469 + | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? 470 + SSC_CKS_PIN : SSC_CKS_CLOCK); 471 471 472 472 rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE) 473 473 | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE) ··· 483 481 | SSC_BF(TCMR_START, start_event) 484 482 | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) 485 483 | SSC_BF(TCMR_CKO, SSC_CKO_NONE) 486 - | SSC_BF(TCMR_CKS, SSC_CKS_PIN); 484 + | SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ? 485 + SSC_CKS_CLOCK : SSC_CKS_PIN); 487 486 488 487 tfmr = SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE) 489 488 | SSC_BF(TFMR_FSDEN, 0) ··· 553 550 | SSC_BF(RCMR_START, SSC_START_RISING_RF) 554 551 | SSC_BF(RCMR_CKI, SSC_CKI_RISING) 555 552 | SSC_BF(RCMR_CKO, SSC_CKO_NONE) 556 - | SSC_BF(RCMR_CKS, SSC_CKS_PIN); 553 + | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? 554 + SSC_CKS_PIN : SSC_CKS_CLOCK); 557 555 558 556 rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE) 559 557 | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE) ··· 569 565 | SSC_BF(TCMR_START, SSC_START_RISING_RF) 570 566 | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) 571 567 | SSC_BF(TCMR_CKO, SSC_CKO_NONE) 572 - | SSC_BF(TCMR_CKS, SSC_CKS_PIN); 568 + | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? 569 + SSC_CKS_CLOCK : SSC_CKS_PIN); 573 570 574 571 tfmr = SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE) 575 572 | SSC_BF(TFMR_FSDEN, 0)