Skip to content

Commit 678cf3f

Browse files
authored
Merge pull request #271 from mmaka1/hda-clk-drift-fix
Hda clk drift fix
2 parents 3093cf6 + 0c5a0a0 commit 678cf3f

7 files changed

Lines changed: 51 additions & 16 deletions

File tree

src/drivers/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ if BUILD_CANNONLAKE
3535
libdrivers_a_SOURCES += \
3636
apl-ssp.c \
3737
hda-dma.c \
38+
cavs-hda.c \
3839
dmic.c
3940
endif
4041

src/drivers/hda-dma.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,7 @@
8484

8585
#define HDA_DMA_MAX_CHANS 9
8686

87-
/* TODO: 10% adjustment for inaccurate queue timer */
88-
#define HDA_LINK_1MS_US 1010
87+
#define HDA_LINK_1MS_US 1000
8988

9089
struct hda_chan_data {
9190
struct dma *dma;

src/include/sof/clock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ uint32_t clock_set_freq(int clock, unsigned int hz);
5252
uint32_t clock_get_freq(int clock);
5353

5454
uint64_t clock_us_to_ticks(int clock, uint64_t us);
55+
uint64_t clock_ms_to_ticks(int clock, uint64_t ms);
5556

5657
uint64_t clock_time_elapsed(int clock, uint64_t previous, uint64_t *current);
5758

src/lib/work.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ struct work_queue {
6666
spinlock_t lock;
6767
struct notifier notifier; /* notify CPU freq changes */
6868
struct work_queue_timesource *ts; /* time source for work queue */
69-
uint32_t ticks_per_usec; /* ticks per msec */
69+
uint32_t ticks_per_usec; /* ticks per usec */
70+
uint32_t ticks_per_msec; /* ticks per msec */
7071
uint64_t run_ticks; /* ticks when last run */
7172
};
7273

@@ -149,12 +150,18 @@ static inline void work_next_timeout(struct work_queue *queue,
149150
struct work *work, uint64_t reschedule_usecs)
150151
{
151152
/* reschedule work */
153+
uint64_t next_d = 0;
154+
155+
if (reschedule_usecs % 1000)
156+
next_d = queue->ticks_per_usec * reschedule_usecs;
157+
else
158+
next_d = queue->ticks_per_msec * (reschedule_usecs / 1000);
159+
152160
if (work->flags & WORK_SYNC) {
153-
work->timeout += queue->ticks_per_usec * reschedule_usecs;
161+
work->timeout += next_d;
154162
} else {
155163
/* calc next run based on work request */
156-
work->timeout = queue->ticks_per_usec *
157-
reschedule_usecs + queue->run_ticks;
164+
work->timeout = next_d + queue->run_ticks;
158165
}
159166
}
160167

@@ -349,7 +356,12 @@ void work_schedule(struct work_queue *queue, struct work *w, uint64_t timeout)
349356
}
350357

351358
/* convert timeout micro seconds to CPU clock ticks */
352-
w->timeout = queue->ticks_per_usec * timeout + work_get_timer(queue);
359+
if (timeout % 1000)
360+
w->timeout = queue->ticks_per_usec * timeout +
361+
work_get_timer(queue);
362+
else
363+
w->timeout = queue->ticks_per_msec * (timeout / 1000) +
364+
work_get_timer(queue);
353365

354366
/* insert work into list */
355367
list_item_prepend(&w->list, &queue->work);
@@ -450,6 +462,7 @@ struct work_queue *work_new_queue(struct work_queue_timesource *ts)
450462
spinlock_init(&queue->lock);
451463
queue->ts = ts;
452464
queue->ticks_per_usec = clock_us_to_ticks(queue->ts->clk, 1);
465+
queue->ticks_per_msec = clock_ms_to_ticks(queue->ts->clk, 1);
453466
queue->window_size = queue->ticks_per_usec * PLATFORM_WORKQ_WINDOW;
454467

455468
/* notification of clk changes */

src/platform/baytrail/clk.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,11 @@ uint64_t clock_us_to_ticks(int clock, uint64_t us)
234234
return clk_pdata->clk[clock].ticks_per_usec * us;
235235
}
236236

237+
uint64_t clock_ms_to_ticks(int clock, uint64_t ms)
238+
{
239+
return clk_pdata->clk[clock].ticks_per_usec * ms * 1000;
240+
}
241+
237242
uint64_t clock_time_elapsed(int clock, uint64_t previous, uint64_t *current)
238243
{
239244
uint64_t _current;

src/platform/haswell/clk.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,11 @@ uint64_t clock_us_to_ticks(int clock, uint64_t us)
168168
return clk_pdata->clk[clock].ticks_per_usec * us;
169169
}
170170

171+
uint64_t clock_ms_to_ticks(int clock, uint64_t ms)
172+
{
173+
return clk_pdata->clk[clock].ticks_per_usec * ms * 1000;
174+
}
175+
171176
uint64_t clock_time_elapsed(int clock, uint64_t previous, uint64_t *current)
172177
{
173178
uint64_t _current;

src/platform/intel/cavs/clk.c

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
struct clk_data {
5151
uint32_t freq;
5252
uint32_t ticks_per_usec;
53+
uint32_t ticks_per_msec;
5354
spinlock_t lock;
5455
};
5556

@@ -60,6 +61,7 @@ struct clk_pdata {
6061
struct freq_table {
6162
uint32_t freq;
6263
uint32_t ticks_per_usec;
64+
uint32_t ticks_per_msec;
6365
uint32_t enc;
6466
};
6567

@@ -69,14 +71,14 @@ static struct clk_pdata *clk_pdata;
6971

7072
#if defined(CONFIG_APOLLOLAKE)
7173
static const struct freq_table cpu_freq[] = {
72-
{100000000, 100, 0x3},
73-
{200000000, 200, 0x1},
74-
{400000000, 400, 0x0}, /* default */
74+
{100000000, 100, 100000, 0x3},
75+
{200000000, 200, 200000, 0x1},
76+
{400000000, 400, 400000, 0x0}, /* default */
7577
};
7678
#elif defined(CONFIG_CANNONLAKE)
7779
static const struct freq_table cpu_freq[] = {
78-
{120000000, 120, 0x0},
79-
{400000000, 400, 0x4},
80+
{120000000, 120, 120000, 0x0},
81+
{400000000, 400, 400000, 0x4},
8082
};
8183
#endif
8284

@@ -86,13 +88,13 @@ static const struct freq_table cpu_freq[] = {
8688

8789
#if defined(CONFIG_APOLLOLAKE)
8890
static const struct freq_table ssp_freq[] = {
89-
{19200000, 19,}, /* default */
90-
{24576000, 24,},
91+
{19200000, 19, 19200, }, /* default */
92+
{24576000, 24, 24576, },
9193
};
9294
#elif defined(CONFIG_CANNONLAKE)
9395
static const struct freq_table ssp_freq[] = {
94-
{19200000, 19,},
95-
{24000000, 24,}, /* default */
96+
{19200000, 19, 19200, },
97+
{24000000, 24, 24000, }, /* default */
9698
};
9799
#endif
98100

@@ -194,6 +196,11 @@ uint64_t clock_us_to_ticks(int clock, uint64_t us)
194196
return clk_pdata->clk[clock].ticks_per_usec * us;
195197
}
196198

199+
uint64_t clock_ms_to_ticks(int clock, uint64_t ms)
200+
{
201+
return clk_pdata->clk[clock].ticks_per_msec * ms;
202+
}
203+
197204
uint64_t clock_time_elapsed(int clock, uint64_t previous, uint64_t *current)
198205
{
199206
uint64_t _current;
@@ -230,7 +237,11 @@ void init_platform_clocks(void)
230237
clk_pdata->clk[CLK_CPU].freq = cpu_freq[CPU_DEFAULT_IDX].freq;
231238
clk_pdata->clk[CLK_CPU].ticks_per_usec =
232239
cpu_freq[CPU_DEFAULT_IDX].ticks_per_usec;
240+
clk_pdata->clk[CLK_CPU].ticks_per_msec =
241+
cpu_freq[CPU_DEFAULT_IDX].ticks_per_msec;
233242
clk_pdata->clk[CLK_SSP].freq = ssp_freq[SSP_DEFAULT_IDX].freq;
234243
clk_pdata->clk[CLK_SSP].ticks_per_usec =
235244
ssp_freq[SSP_DEFAULT_IDX].ticks_per_usec;
245+
clk_pdata->clk[CLK_SSP].ticks_per_msec =
246+
ssp_freq[SSP_DEFAULT_IDX].ticks_per_msec;
236247
}

0 commit comments

Comments
 (0)