Skip to content

Commit 1ba7b5e

Browse files
author
Marcin Maka
committed
plat: apl: clock gating adjusted for dai, dma, and cores
dai clocks ungated and resources allocated on the first use. dma clocks ungated and resources allocated on the first use. cores clocks gated in idle. Signed-off-by: Marcin Maka <marcin.maka@linux.intel.com>
1 parent f42c657 commit 1ba7b5e

28 files changed

Lines changed: 327 additions & 233 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)