Skip to content

Commit b180af8

Browse files
authored
Merge pull request #452 from mmaka1/clk-gating
plat: apl: clock gating adjusted for dai, dma, and cores
2 parents aeb18ee + 1ba7b5e commit b180af8

28 files changed

Lines changed: 335 additions & 235 deletions

File tree

Makefile.am

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,6 @@ export ARCH_INCDIR
4343

4444
PLATFORM_INCDIR = -I $(SRC_DIR)/platform/$(PLATFORM)/include
4545

46-
if BUILD_CAVS
47-
PLATFORM_INCDIR += \
48-
-I $(SRC_DIR)/platform/intel/include
49-
endif
50-
5146
if XCC
5247
PLATFORM_INCDIR += \
5348
-I $(ROOT_DIR)/arch/include

configure.ac

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -566,9 +566,6 @@ AC_CONFIG_FILES([
566566
src/platform/icelake/include/platform/Makefile
567567
src/platform/intel/Makefile
568568
src/platform/intel/cavs/Makefile
569-
src/platform/intel/include/Makefile
570-
src/platform/intel/include/platform/Makefile
571-
src/platform/intel/include/platform/cavs/Makefile
572569
test/Makefile
573570
test/cmocka/Makefile
574571
])

src/drivers/intel/baytrail/ssp.c

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,11 @@ static int hweight_32(uint32_t mask)
5757
/* empty SSP receive FIFO */
5858
static void ssp_empty_rx_fifo(struct dai *dai)
5959
{
60-
struct ssp_pdata *ssp = dai_get_drvdata(dai);
6160
uint32_t sssr;
6261
uint32_t entries;
6362
uint32_t i;
6463

65-
spin_lock(&ssp->lock);
64+
spin_lock(&dai->lock);
6665

6766
sssr = ssp_read(dai, SSSR);
6867

@@ -77,7 +76,7 @@ static void ssp_empty_rx_fifo(struct dai *dai)
7776
ssp_read(dai, SSDR);
7877
}
7978

80-
spin_unlock(&ssp->lock);
79+
spin_unlock(&dai->lock);
8180
}
8281

8382
/* save SSP context prior to entering D3 */
@@ -132,7 +131,7 @@ static inline int ssp_set_config(struct dai *dai,
132131
bool cbs = false;
133132
int ret = 0;
134133

135-
spin_lock(&ssp->lock);
134+
spin_lock(&dai->lock);
136135

137136
/* is playback/capture already running */
138137
if (ssp->state[DAI_DIR_PLAYBACK] == COMP_STATE_ACTIVE ||
@@ -473,22 +472,20 @@ static inline int ssp_set_config(struct dai *dai,
473472
ssp->state[DAI_DIR_CAPTURE] = COMP_STATE_PREPARE;
474473

475474
out:
476-
spin_unlock(&ssp->lock);
475+
spin_unlock(&dai->lock);
477476

478477
return ret;
479478
}
480479

481480
/* Digital Audio interface formatting */
482481
static inline int ssp_set_loopback_mode(struct dai *dai, uint32_t lbm)
483482
{
484-
struct ssp_pdata *ssp = dai_get_drvdata(dai);
485-
486483
trace_ssp("loo");
487-
spin_lock(&ssp->lock);
484+
spin_lock(&dai->lock);
488485

489486
ssp_update_bits(dai, SSCR1, SSCR1_LBM, lbm ? SSCR1_LBM : 0);
490487

491-
spin_unlock(&ssp->lock);
488+
spin_unlock(&dai->lock);
492489

493490
return 0;
494491
}
@@ -498,7 +495,7 @@ static void ssp_start(struct dai *dai, int direction)
498495
{
499496
struct ssp_pdata *ssp = dai_get_drvdata(dai);
500497

501-
spin_lock(&ssp->lock);
498+
spin_lock(&dai->lock);
502499

503500
/* enable port */
504501
ssp_update_bits(dai, SSCR0, SSCR0_SSE, SSCR0_SSE);
@@ -512,15 +509,15 @@ static void ssp_start(struct dai *dai, int direction)
512509
else
513510
ssp_update_bits(dai, SSCR1, SSCR1_RSRE, SSCR1_RSRE);
514511

515-
spin_unlock(&ssp->lock);
512+
spin_unlock(&dai->lock);
516513
}
517514

518515
/* stop the SSP for either playback or capture */
519516
static void ssp_stop(struct dai *dai, int direction)
520517
{
521518
struct ssp_pdata *ssp = dai_get_drvdata(dai);
522519

523-
spin_lock(&ssp->lock);
520+
spin_lock(&dai->lock);
524521

525522
/* stop Rx if neeed */
526523
if (direction == DAI_DIR_CAPTURE &&
@@ -548,7 +545,7 @@ static void ssp_stop(struct dai *dai, int direction)
548545
trace_ssp("Ss2");
549546
}
550547

551-
spin_unlock(&ssp->lock);
548+
spin_unlock(&dai->lock);
552549
}
553550

554551
static int ssp_trigger(struct dai *dai, int cmd, int direction)
@@ -607,7 +604,7 @@ static int ssp_probe(struct dai *dai)
607604
sizeof(*ssp));
608605
dai_set_drvdata(dai, ssp);
609606

610-
spinlock_init(&ssp->lock);
607+
spinlock_init(&dai->lock);
611608

612609
ssp->state[DAI_DIR_PLAYBACK] = COMP_STATE_READY;
613610
ssp->state[DAI_DIR_CAPTURE] = COMP_STATE_READY;

src/drivers/intel/cavs/clk.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ uint32_t clock_set_freq(int clock, uint32_t hz)
139139
notify_data.old_freq = clk_pdata->clk[clock].freq;
140140
notify_data.old_ticks_per_msec = clk_pdata->clk[clock].ticks_per_msec;
141141

142-
/* atomic context for chaning clocks */
142+
/* atomic context for changing clocks */
143143
spin_lock_irq(&clk_pdata->clk[clock].lock, flags);
144144

145145
switch (clock) {
@@ -157,6 +157,8 @@ uint32_t clock_set_freq(int clock, uint32_t hz)
157157
io_reg_update_bits(SHIM_BASE + SHIM_CLKCTL,
158158
SHIM_CLKCTL_HDCS, 0);
159159
#endif
160+
161+
/* TODO: should handle all cores or pass the index as arg */
160162
io_reg_update_bits(SHIM_BASE + SHIM_CLKCTL,
161163
SHIM_CLKCTL_DPCS_MASK(0), cpu_freq[idx].enc);
162164

src/drivers/intel/cavs/dmic.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include <sof/stream.h>
3232
#include <sof/dmic.h>
3333
#include <sof/interrupt.h>
34+
#include <sof/pm_runtime.h>
3435
#include <sof/math/numbers.h>
3536
#include <sof/audio/format.h>
3637

@@ -207,7 +208,7 @@ static uint64_t dmic_work(void *data, uint64_t delay)
207208
int i;
208209

209210
tracev_dmic("wrk");
210-
spin_lock(&dmic->lock);
211+
spin_lock(&dai->lock);
211212

212213
/* Increment gain with logaritmic step.
213214
* Gain is Q2.30 and gain modifier is Q2.14.
@@ -257,7 +258,7 @@ static uint64_t dmic_work(void *data, uint64_t delay)
257258
dmic_write(dai, base[i] + OUT_GAIN_RIGHT_B, val);
258259
}
259260
}
260-
spin_unlock(&dmic->lock);
261+
spin_unlock(&dai->lock);
261262

262263
if (gval)
263264
return DMIC_UNMUTE_RAMP_US;
@@ -1236,7 +1237,7 @@ static void dmic_start(struct dai *dai)
12361237
int fir_b;
12371238

12381239
/* enable port */
1239-
spin_lock(&dmic->lock);
1240+
spin_lock(&dai->lock);
12401241
trace_dmic("sta");
12411242
dmic->state = COMP_STATE_ACTIVE;
12421243
dmic->startcount = 0;
@@ -1305,7 +1306,7 @@ static void dmic_start(struct dai *dai)
13051306
CIC_CONTROL_SOFT_RESET_BIT, 0);
13061307
}
13071308

1308-
spin_unlock(&dmic->lock);
1309+
spin_unlock(&dai->lock);
13091310

13101311
/* Currently there's no DMIC HW internal mutings and wait times
13111312
* applied into this start sequence. It can be implemented here if
@@ -1324,7 +1325,7 @@ static void dmic_stop(struct dai *dai)
13241325
int i;
13251326

13261327
trace_dmic("sto")
1327-
spin_lock(&dmic->lock);
1328+
spin_lock(&dai->lock);
13281329
dmic->state = COMP_STATE_PREPARE;
13291330

13301331
/* Stop FIFO packers and set FIFO initialize bits */
@@ -1352,7 +1353,7 @@ static void dmic_stop(struct dai *dai)
13521353
FIR_CONTROL_B_MUTE_BIT);
13531354
}
13541355

1355-
spin_unlock(&dmic->lock);
1356+
spin_unlock(&dai->lock);
13561357
}
13571358

13581359
/* save DMIC context prior to entering D3 */
@@ -1446,6 +1447,12 @@ static int dmic_probe(struct dai *dai)
14461447

14471448
trace_dmic("pro");
14481449

1450+
if (dai_get_drvdata(dai))
1451+
return -EEXIST; /* already created */
1452+
1453+
/* Disable dynamic clock gating for dmic before touching any reg */
1454+
pm_runtime_get_sync(DMIC_CLK, dai->index);
1455+
14491456
/* allocate private data */
14501457
dmic = rzalloc(RZONE_SYS | RZONE_FLAG_UNCACHED, SOF_MEM_CAPS_RAM,
14511458
sizeof(*dmic));
@@ -1455,8 +1462,6 @@ static int dmic_probe(struct dai *dai)
14551462
}
14561463
dai_set_drvdata(dai, dmic);
14571464

1458-
spinlock_init(&dmic->lock);
1459-
14601465
/* Set state, note there is no playback direction support */
14611466
dmic->state = COMP_STATE_READY;
14621467

src/drivers/intel/cavs/hda-dma.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -612,13 +612,17 @@ static int hda_dma_probe(struct dma *dma)
612612
int i;
613613
struct hda_chan_data *chan;
614614

615+
trace_event(TRACE_CLASS_DMA, "hda-dma-probe %p id %d",
616+
(uintptr_t)dma, dma->plat_data.id);
617+
618+
if (dma_get_drvdata(dma))
619+
return -EEXIST; /* already created */
620+
615621
/* allocate private data */
616622
hda_pdata = rzalloc(RZONE_SYS | RZONE_FLAG_UNCACHED, SOF_MEM_CAPS_RAM,
617623
sizeof(*hda_pdata));
618624
dma_set_drvdata(dma, hda_pdata);
619625

620-
spinlock_init(&dma->lock);
621-
622626
/* init channel status */
623627
chan = hda_pdata->chan;
624628

src/drivers/intel/cavs/ssp.c

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <sof/ssp.h>
3737
#include <sof/alloc.h>
3838
#include <sof/interrupt.h>
39+
#include <sof/pm_runtime.h>
3940
#include <sof/math/numbers.h>
4041
#include <config.h>
4142

@@ -65,29 +66,27 @@ static int hweight_32(uint32_t mask)
6566
/* empty SSP transmit FIFO */
6667
static void ssp_empty_tx_fifo(struct dai *dai)
6768
{
68-
struct ssp_pdata *ssp = dai_get_drvdata(dai);
6969
uint32_t sssr;
7070

71-
spin_lock(&ssp->lock);
71+
spin_lock(&dai->lock);
7272

7373
sssr = ssp_read(dai, SSSR);
7474

7575
/* clear interrupt */
7676
if (sssr & SSSR_TUR)
7777
ssp_write(dai, SSSR, sssr);
7878

79-
spin_unlock(&ssp->lock);
79+
spin_unlock(&dai->lock);
8080
}
8181

8282
/* empty SSP receive FIFO */
8383
static void ssp_empty_rx_fifo(struct dai *dai)
8484
{
85-
struct ssp_pdata *ssp = dai_get_drvdata(dai);
8685
uint32_t sssr;
8786
uint32_t entries;
8887
uint32_t i;
8988

90-
spin_lock(&ssp->lock);
89+
spin_lock(&dai->lock);
9190

9291
sssr = ssp_read(dai, SSSR);
9392

@@ -102,7 +101,7 @@ static void ssp_empty_rx_fifo(struct dai *dai)
102101
ssp_read(dai, SSDR);
103102
}
104103

105-
spin_unlock(&ssp->lock);
104+
spin_unlock(&dai->lock);
106105
}
107106

108107
/* save SSP context prior to entering D3 */
@@ -171,7 +170,7 @@ static inline int ssp_set_config(struct dai *dai,
171170
bool start_delay = false;
172171
int ret = 0;
173172

174-
spin_lock(&ssp->lock);
173+
spin_lock(&dai->lock);
175174

176175
/* is playback/capture already running */
177176
if (ssp->state[DAI_DIR_PLAYBACK] == COMP_STATE_ACTIVE ||
@@ -733,22 +732,20 @@ static inline int ssp_set_config(struct dai *dai,
733732
ssp->state[DAI_DIR_CAPTURE] = COMP_STATE_PREPARE;
734733

735734
out:
736-
spin_unlock(&ssp->lock);
735+
spin_unlock(&dai->lock);
737736

738737
return ret;
739738
}
740739

741740
/* Digital Audio interface formatting */
742741
static inline int ssp_set_loopback_mode(struct dai *dai, uint32_t lbm)
743742
{
744-
struct ssp_pdata *ssp = dai_get_drvdata(dai);
745-
746743
trace_ssp("loo");
747-
spin_lock(&ssp->lock);
744+
spin_lock(&dai->lock);
748745

749746
ssp_update_bits(dai, SSCR1, SSCR1_LBM, lbm ? SSCR1_LBM : 0);
750747

751-
spin_unlock(&ssp->lock);
748+
spin_unlock(&dai->lock);
752749

753750
return 0;
754751
}
@@ -758,7 +755,7 @@ static void ssp_start(struct dai *dai, int direction)
758755
{
759756
struct ssp_pdata *ssp = dai_get_drvdata(dai);
760757

761-
spin_lock(&ssp->lock);
758+
spin_lock(&dai->lock);
762759

763760
/* enable port */
764761
ssp_update_bits(dai, SSCR0, SSCR0_SSE, SSCR0_SSE);
@@ -775,15 +772,15 @@ static void ssp_start(struct dai *dai, int direction)
775772
ssp_update_bits(dai, SSRSA, 0x1 << 8, 0x1 << 8);
776773
}
777774

778-
spin_unlock(&ssp->lock);
775+
spin_unlock(&dai->lock);
779776
}
780777

781778
/* stop the SSP for either playback or capture */
782779
static void ssp_stop(struct dai *dai, int direction)
783780
{
784781
struct ssp_pdata *ssp = dai_get_drvdata(dai);
785782

786-
spin_lock(&ssp->lock);
783+
spin_lock(&dai->lock);
787784

788785
/* wait to get valid fifo status */
789786
wait_delay(PLATFORM_SSP_STOP_DELAY);
@@ -817,7 +814,7 @@ static void ssp_stop(struct dai *dai, int direction)
817814
trace_ssp("Ss2");
818815
}
819816

820-
spin_unlock(&ssp->lock);
817+
spin_unlock(&dai->lock);
821818
}
822819

823820
static int ssp_trigger(struct dai *dai, int cmd, int direction)
@@ -871,13 +868,17 @@ static int ssp_probe(struct dai *dai)
871868
{
872869
struct ssp_pdata *ssp;
873870

871+
if (dai_get_drvdata(dai))
872+
return -EEXIST; /* already created */
873+
874+
/* Disable dynamic clock gating before touching any register */
875+
pm_runtime_get_sync(SSP_CLK, dai->index);
876+
874877
/* allocate private data */
875878
ssp = rzalloc(RZONE_SYS | RZONE_FLAG_UNCACHED, SOF_MEM_CAPS_RAM,
876879
sizeof(*ssp));
877880
dai_set_drvdata(dai, ssp);
878881

879-
spinlock_init(&ssp->lock);
880-
881882
ssp->state[DAI_DIR_PLAYBACK] = COMP_STATE_READY;
882883
ssp->state[DAI_DIR_CAPTURE] = COMP_STATE_READY;
883884

0 commit comments

Comments
 (0)