Module Name: src
Committed By: skrll
Date: Fri Feb 4 11:00:31 UTC 2011
Modified Files:
src/sys/arch/hp700/gsc: harmony.c
Log Message:
A better workaround hack for PR 41448
Bound the wait loop
To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/arch/hp700/gsc/harmony.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/hp700/gsc/harmony.c
diff -u src/sys/arch/hp700/gsc/harmony.c:1.21 src/sys/arch/hp700/gsc/harmony.c:1.22
--- src/sys/arch/hp700/gsc/harmony.c:1.21 Fri Feb 4 10:56:03 2011
+++ src/sys/arch/hp700/gsc/harmony.c Fri Feb 4 11:00:30 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: harmony.c,v 1.21 2011/02/04 10:56:03 skrll Exp $ */
+/* $NetBSD: harmony.c,v 1.22 2011/02/04 11:00:30 skrll Exp $ */
/* $OpenBSD: harmony.c,v 1.23 2004/02/13 21:28:19 mickey Exp $ */
@@ -98,7 +98,10 @@
int harmony_set_params(void *, int, int, audio_params_t *,
audio_params_t *, stream_filter_list_t *, stream_filter_list_t *);
int harmony_round_blocksize(void *, int, int, const audio_params_t *);
+
+int harmony_control_wait(struct harmony_softc *);
int harmony_commit_settings(void *);
+
int harmony_halt_output(void *);
int harmony_halt_input(void *);
int harmony_getdev(void *, struct audio_device *);
@@ -623,6 +626,24 @@
}
int
+harmony_control_wait(struct harmony_softc *sc)
+{
+ uint32_t reg;
+ int j = 0;
+
+ while (j < 10) {
+ /* Wait for it to come out of control mode */
+ reg = READ_REG(sc, HARMONY_CNTL);
+ if ((reg & CNTL_C) == 0)
+ return 0;
+ DELAY(50000); /* wait 0.05 */
+ j++;
+ }
+
+ return 1;
+}
+
+int
harmony_commit_settings(void *vsc)
{
struct harmony_softc *sc;
@@ -669,24 +690,12 @@
offsetof(struct harmony_empty, playback[0][0]),
PLAYBACK_EMPTYS * HARMONY_BUFSIZE, BUS_DMASYNC_PREWRITE);
- for (;;) {
- /* Wait for it to come out of control mode */
- reg = READ_REG(sc, HARMONY_CNTL);
- if ((reg & CNTL_C) == 0)
- break;
- }
+ harmony_control_wait(sc);
bus_space_write_4(sc->sc_bt, sc->sc_bh, HARMONY_CNTL,
sc->sc_cntlbits | CNTL_C);
-#if 0
- for (;;) {
- /* Wait for it to come out of control mode */
- reg = READ_REG(sc, HARMONY_CNTL);
- if ((reg & CNTL_C) == 0)
- break;
- }
-#endif
+ harmony_control_wait(sc);
sc->sc_need_commit = 0;