Lines Matching refs:instance

25 static void bcm2835_audio_lock(struct bcm2835_audio_instance *instance)  in bcm2835_audio_lock()  argument
27 mutex_lock(&instance->vchi_mutex); in bcm2835_audio_lock()
28 vchiq_use_service(instance->alsa_stream->chip->vchi_ctx->instance, in bcm2835_audio_lock()
29 instance->service_handle); in bcm2835_audio_lock()
32 static void bcm2835_audio_unlock(struct bcm2835_audio_instance *instance) in bcm2835_audio_unlock() argument
34 vchiq_release_service(instance->alsa_stream->chip->vchi_ctx->instance, in bcm2835_audio_unlock()
35 instance->service_handle); in bcm2835_audio_unlock()
36 mutex_unlock(&instance->vchi_mutex); in bcm2835_audio_unlock()
39 static int bcm2835_audio_send_msg_locked(struct bcm2835_audio_instance *instance, in bcm2835_audio_send_msg_locked() argument
45 instance->result = -1; in bcm2835_audio_send_msg_locked()
46 init_completion(&instance->msg_avail_comp); in bcm2835_audio_send_msg_locked()
49 status = vchiq_queue_kernel_message(instance->alsa_stream->chip->vchi_ctx->instance, in bcm2835_audio_send_msg_locked()
50 instance->service_handle, m, sizeof(*m)); in bcm2835_audio_send_msg_locked()
52 dev_err(instance->dev, in bcm2835_audio_send_msg_locked()
59 if (!wait_for_completion_timeout(&instance->msg_avail_comp, in bcm2835_audio_send_msg_locked()
61 dev_err(instance->dev, in bcm2835_audio_send_msg_locked()
64 } else if (instance->result) { in bcm2835_audio_send_msg_locked()
65 dev_err(instance->dev, in bcm2835_audio_send_msg_locked()
67 instance->result, m->type); in bcm2835_audio_send_msg_locked()
75 static int bcm2835_audio_send_msg(struct bcm2835_audio_instance *instance, in bcm2835_audio_send_msg() argument
80 bcm2835_audio_lock(instance); in bcm2835_audio_send_msg()
81 err = bcm2835_audio_send_msg_locked(instance, m, wait); in bcm2835_audio_send_msg()
82 bcm2835_audio_unlock(instance); in bcm2835_audio_send_msg()
86 static int bcm2835_audio_send_simple(struct bcm2835_audio_instance *instance, in bcm2835_audio_send_simple() argument
91 return bcm2835_audio_send_msg(instance, &m, wait); in bcm2835_audio_send_simple()
99 struct bcm2835_audio_instance *instance = vchiq_get_service_userdata(vchiq_instance, in audio_vchi_callback() local
108 instance->result = m->result.success; in audio_vchi_callback()
109 complete(&instance->msg_avail_comp); in audio_vchi_callback()
113 dev_err(instance->dev, "invalid cookie\n"); in audio_vchi_callback()
115 bcm2835_playback_fifo(instance->alsa_stream, in audio_vchi_callback()
118 dev_err(instance->dev, "unexpected callback type=%d\n", m->type); in audio_vchi_callback()
121 vchiq_release_message(vchiq_instance, instance->service_handle, header); in audio_vchi_callback()
127 struct bcm2835_audio_instance *instance) in vc_vchi_audio_init() argument
134 .userdata = instance, in vc_vchi_audio_init()
140 &instance->service_handle); in vc_vchi_audio_init()
143 dev_err(instance->dev, in vc_vchi_audio_init()
150 vchiq_release_service(instance->alsa_stream->chip->vchi_ctx->instance, in vc_vchi_audio_init()
151 instance->service_handle); in vc_vchi_audio_init()
156 static void vc_vchi_audio_deinit(struct bcm2835_audio_instance *instance) in vc_vchi_audio_deinit() argument
160 mutex_lock(&instance->vchi_mutex); in vc_vchi_audio_deinit()
161 vchiq_use_service(instance->alsa_stream->chip->vchi_ctx->instance, in vc_vchi_audio_deinit()
162 instance->service_handle); in vc_vchi_audio_deinit()
165 status = vchiq_close_service(instance->alsa_stream->chip->vchi_ctx->instance, in vc_vchi_audio_deinit()
166 instance->service_handle); in vc_vchi_audio_deinit()
168 dev_err(instance->dev, in vc_vchi_audio_deinit()
173 mutex_unlock(&instance->vchi_mutex); in vc_vchi_audio_deinit()
181 ret = vchiq_initialise(&vchi_ctx->instance); in bcm2835_new_vchi_ctx()
188 ret = vchiq_connect(vchi_ctx->instance); in bcm2835_new_vchi_ctx()
193 kfree(vchi_ctx->instance); in bcm2835_new_vchi_ctx()
194 vchi_ctx->instance = NULL; in bcm2835_new_vchi_ctx()
205 WARN_ON(vchiq_shutdown(vchi_ctx->instance)); in bcm2835_free_vchi_ctx()
207 vchi_ctx->instance = NULL; in bcm2835_free_vchi_ctx()
213 struct bcm2835_audio_instance *instance; in bcm2835_audio_open() local
217 instance = kzalloc(sizeof(*instance), GFP_KERNEL); in bcm2835_audio_open()
218 if (!instance) in bcm2835_audio_open()
220 mutex_init(&instance->vchi_mutex); in bcm2835_audio_open()
221 instance->dev = alsa_stream->chip->dev; in bcm2835_audio_open()
222 instance->alsa_stream = alsa_stream; in bcm2835_audio_open()
223 alsa_stream->instance = instance; in bcm2835_audio_open()
225 err = vc_vchi_audio_init(vchi_ctx->instance, in bcm2835_audio_open()
226 instance); in bcm2835_audio_open()
230 err = bcm2835_audio_send_simple(instance, VC_AUDIO_MSG_TYPE_OPEN, in bcm2835_audio_open()
235 bcm2835_audio_lock(instance); in bcm2835_audio_open()
236 vchiq_get_peer_version(vchi_ctx->instance, instance->service_handle, in bcm2835_audio_open()
237 &instance->peer_version); in bcm2835_audio_open()
238 bcm2835_audio_unlock(instance); in bcm2835_audio_open()
239 if (instance->peer_version < 2 || force_bulk) in bcm2835_audio_open()
240 instance->max_packet = 0; /* bulk transfer */ in bcm2835_audio_open()
242 instance->max_packet = 4000; in bcm2835_audio_open()
247 vc_vchi_audio_deinit(instance); in bcm2835_audio_open()
249 alsa_stream->instance = NULL; in bcm2835_audio_open()
250 kfree(instance); in bcm2835_audio_open()
266 return bcm2835_audio_send_msg(alsa_stream->instance, &m, true); in bcm2835_audio_set_ctls()
286 return bcm2835_audio_send_msg(alsa_stream->instance, &m, true); in bcm2835_audio_set_params()
291 return bcm2835_audio_send_simple(alsa_stream->instance, in bcm2835_audio_start()
297 return bcm2835_audio_send_simple(alsa_stream->instance, in bcm2835_audio_stop()
309 return bcm2835_audio_send_msg(alsa_stream->instance, &m, false); in bcm2835_audio_drain()
314 struct bcm2835_audio_instance *instance = alsa_stream->instance; in bcm2835_audio_close() local
317 err = bcm2835_audio_send_simple(alsa_stream->instance, in bcm2835_audio_close()
321 vc_vchi_audio_deinit(instance); in bcm2835_audio_close()
322 alsa_stream->instance = NULL; in bcm2835_audio_close()
323 kfree(instance); in bcm2835_audio_close()
331 struct bcm2835_audio_instance *instance = alsa_stream->instance; in bcm2835_audio_write() local
333 struct vchiq_instance *vchiq_instance = vchi_ctx->instance; in bcm2835_audio_write()
337 .write.max_packet = instance->max_packet, in bcm2835_audio_write()
347 bcm2835_audio_lock(instance); in bcm2835_audio_write()
348 err = bcm2835_audio_send_msg_locked(instance, &m, false); in bcm2835_audio_write()
353 if (!instance->max_packet) { in bcm2835_audio_write()
355 status = vchiq_bulk_transmit(vchiq_instance, instance->service_handle, src, count, in bcm2835_audio_write()
359 int bytes = min(instance->max_packet, count); in bcm2835_audio_write()
362 instance->service_handle, src, bytes); in bcm2835_audio_write()
369 dev_err(instance->dev, in bcm2835_audio_write()
376 bcm2835_audio_unlock(instance); in bcm2835_audio_write()