case MARUCAM_CMD_ISR:\r
qemu_mutex_lock(&state->thread_mutex);\r
ret = state->isr;\r
- state->isr = 0;\r
- qemu_irq_lower(state->dev.irq[2]);\r
+ if (ret != 0) {\r
+ qemu_irq_lower(state->dev.irq[2]);\r
+ state->isr = 0;\r
+ }\r
qemu_mutex_unlock(&state->thread_mutex);\r
break;\r
case MARUCAM_CMD_G_DATA:\r
.endianness = DEVICE_LITTLE_ENDIAN,\r
};\r
\r
+/*\r
+ * QEMU bottom half funtion\r
+ */\r
+static void marucam_tx_bh(void *opaque)\r
+{\r
+ MaruCamState *state = (MaruCamState *)opaque;\r
+\r
+ qemu_mutex_lock(&state->thread_mutex);\r
+ if (state->isr) {\r
+ qemu_irq_raise(state->dev.irq[2]);\r
+ }\r
+ qemu_mutex_unlock(&state->thread_mutex);\r
+}\r
+\r
/*\r
* Initialization function\r
*/\r
\r
marucam_device_init(s);\r
\r
+ s->tx_bh = qemu_bh_new(marucam_tx_bh, s);\r
+\r
return 0;\r
}\r
\r
\r
memory_region_destroy (&s->vram);\r
memory_region_destroy (&s->mmio);\r
+\r
+ INFO("[%s] camera device was released.\n", __func__);\r
return 0;\r
}\r
\r
if (state->req_frame) {\r
state->req_frame = 0; // clear request\r
state->isr |= 0x01; // set a flag of rasing a interrupt.\r
- qemu_irq_raise(state->dev.irq[2]);\r
+ qemu_bh_schedule(state->tx_bh);\r
}\r
ret = 1;\r
} else {\r
#include "qemu-common.h"\r
#include "maru_camera_common.h"\r
#include "tizen/src/debug_ch.h"\r
-#include "tizen/src/mloop_event.h"\r
\r
#define CINTERFACE\r
#define COBJMACROS\r
if (g_state->req_frame) {\r
g_state->req_frame = 0; // clear request\r
g_state->isr |= 0x01; // set a flag raising a interrupt.\r
- mloop_evcmd_raise_intr(g_state->dev.irq[2]);\r
+ qemu_bh_schedule(g_state->tx_bh);\r
}\r
} else {\r
++ready_count; // skip a frame cause first some frame are distorted.\r