Lines Matching refs:adap
157 static void cec_devnode_unregister(struct cec_adapter *adap) in cec_devnode_unregister() argument
159 struct cec_devnode *devnode = &adap->devnode; in cec_devnode_unregister()
177 mutex_lock(&adap->lock); in cec_devnode_unregister()
178 __cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false); in cec_devnode_unregister()
179 __cec_s_log_addrs(adap, NULL, false); in cec_devnode_unregister()
180 mutex_unlock(&adap->lock); in cec_devnode_unregister()
187 static void cec_cec_notify(struct cec_adapter *adap, u16 pa) in cec_cec_notify() argument
189 cec_s_phys_addr(adap, pa, false); in cec_cec_notify()
192 void cec_register_cec_notifier(struct cec_adapter *adap, in cec_register_cec_notifier() argument
195 if (WARN_ON(!cec_is_registered(adap))) in cec_register_cec_notifier()
198 adap->notifier = notifier; in cec_register_cec_notifier()
199 cec_notifier_register(adap->notifier, adap, cec_cec_notify); in cec_register_cec_notifier()
209 struct cec_adapter *adap = sf->private; in cec_error_inj_write() local
223 if (!adap->ops->error_inj_parse_line(adap, line)) { in cec_error_inj_write()
234 struct cec_adapter *adap = sf->private; in cec_error_inj_show() local
236 return adap->ops->error_inj_show(adap, sf); in cec_error_inj_show()
257 struct cec_adapter *adap; in cec_allocate_adapter() local
275 adap = kzalloc(sizeof(*adap), GFP_KERNEL); in cec_allocate_adapter()
276 if (!adap) in cec_allocate_adapter()
278 strscpy(adap->name, name, sizeof(adap->name)); in cec_allocate_adapter()
279 adap->phys_addr = CEC_PHYS_ADDR_INVALID; in cec_allocate_adapter()
280 adap->cec_pin_is_high = true; in cec_allocate_adapter()
281 adap->log_addrs.cec_version = CEC_OP_CEC_VERSION_2_0; in cec_allocate_adapter()
282 adap->log_addrs.vendor_id = CEC_VENDOR_ID_NONE; in cec_allocate_adapter()
283 adap->capabilities = caps; in cec_allocate_adapter()
285 adap->capabilities |= CEC_CAP_PHYS_ADDR; in cec_allocate_adapter()
286 adap->needs_hpd = caps & CEC_CAP_NEEDS_HPD; in cec_allocate_adapter()
287 adap->available_log_addrs = available_las; in cec_allocate_adapter()
288 adap->sequence = 0; in cec_allocate_adapter()
289 adap->ops = ops; in cec_allocate_adapter()
290 adap->priv = priv; in cec_allocate_adapter()
291 memset(adap->phys_addrs, 0xff, sizeof(adap->phys_addrs)); in cec_allocate_adapter()
292 mutex_init(&adap->lock); in cec_allocate_adapter()
293 INIT_LIST_HEAD(&adap->transmit_queue); in cec_allocate_adapter()
294 INIT_LIST_HEAD(&adap->wait_queue); in cec_allocate_adapter()
295 init_waitqueue_head(&adap->kthread_waitq); in cec_allocate_adapter()
298 INIT_LIST_HEAD(&adap->devnode.fhs); in cec_allocate_adapter()
299 mutex_init(&adap->devnode.lock); in cec_allocate_adapter()
301 adap->kthread = kthread_run(cec_thread_func, adap, "cec-%s", name); in cec_allocate_adapter()
302 if (IS_ERR(adap->kthread)) { in cec_allocate_adapter()
304 res = PTR_ERR(adap->kthread); in cec_allocate_adapter()
305 kfree(adap); in cec_allocate_adapter()
311 return adap; in cec_allocate_adapter()
314 adap->rc = rc_allocate_device(RC_DRIVER_SCANCODE); in cec_allocate_adapter()
315 if (!adap->rc) { in cec_allocate_adapter()
318 kthread_stop(adap->kthread); in cec_allocate_adapter()
319 kfree(adap); in cec_allocate_adapter()
323 snprintf(adap->input_phys, sizeof(adap->input_phys), in cec_allocate_adapter()
324 "%s/input0", adap->name); in cec_allocate_adapter()
326 adap->rc->device_name = adap->name; in cec_allocate_adapter()
327 adap->rc->input_phys = adap->input_phys; in cec_allocate_adapter()
328 adap->rc->input_id.bustype = BUS_CEC; in cec_allocate_adapter()
329 adap->rc->input_id.vendor = 0; in cec_allocate_adapter()
330 adap->rc->input_id.product = 0; in cec_allocate_adapter()
331 adap->rc->input_id.version = 1; in cec_allocate_adapter()
332 adap->rc->driver_name = CEC_NAME; in cec_allocate_adapter()
333 adap->rc->allowed_protocols = RC_PROTO_BIT_CEC; in cec_allocate_adapter()
334 adap->rc->priv = adap; in cec_allocate_adapter()
335 adap->rc->map_name = RC_MAP_CEC; in cec_allocate_adapter()
336 adap->rc->timeout = MS_TO_NS(550); in cec_allocate_adapter()
338 return adap; in cec_allocate_adapter()
342 int cec_register_adapter(struct cec_adapter *adap, in cec_register_adapter() argument
347 if (IS_ERR_OR_NULL(adap)) in cec_register_adapter()
353 adap->owner = parent->driver->owner; in cec_register_adapter()
354 adap->devnode.dev.parent = parent; in cec_register_adapter()
357 if (adap->capabilities & CEC_CAP_RC) { in cec_register_adapter()
358 adap->rc->dev.parent = parent; in cec_register_adapter()
359 res = rc_register_device(adap->rc); in cec_register_adapter()
363 adap->name); in cec_register_adapter()
364 rc_free_device(adap->rc); in cec_register_adapter()
365 adap->rc = NULL; in cec_register_adapter()
371 res = cec_devnode_register(&adap->devnode, adap->owner); in cec_register_adapter()
375 rc_unregister_device(adap->rc); in cec_register_adapter()
376 adap->rc = NULL; in cec_register_adapter()
381 dev_set_drvdata(&adap->devnode.dev, adap); in cec_register_adapter()
386 adap->cec_dir = debugfs_create_dir(dev_name(&adap->devnode.dev), top_cec_dir); in cec_register_adapter()
387 if (IS_ERR_OR_NULL(adap->cec_dir)) { in cec_register_adapter()
388 pr_warn("cec-%s: Failed to create debugfs dir\n", adap->name); in cec_register_adapter()
391 adap->status_file = debugfs_create_devm_seqfile(&adap->devnode.dev, in cec_register_adapter()
392 "status", adap->cec_dir, cec_adap_status); in cec_register_adapter()
393 if (IS_ERR_OR_NULL(adap->status_file)) { in cec_register_adapter()
394 pr_warn("cec-%s: Failed to create status file\n", adap->name); in cec_register_adapter()
395 debugfs_remove_recursive(adap->cec_dir); in cec_register_adapter()
396 adap->cec_dir = NULL; in cec_register_adapter()
399 if (!adap->ops->error_inj_show || !adap->ops->error_inj_parse_line) in cec_register_adapter()
401 adap->error_inj_file = debugfs_create_file("error-inj", 0644, in cec_register_adapter()
402 adap->cec_dir, adap, in cec_register_adapter()
404 if (IS_ERR_OR_NULL(adap->error_inj_file)) in cec_register_adapter()
406 adap->name); in cec_register_adapter()
412 void cec_unregister_adapter(struct cec_adapter *adap) in cec_unregister_adapter() argument
414 if (IS_ERR_OR_NULL(adap)) in cec_unregister_adapter()
419 rc_unregister_device(adap->rc); in cec_unregister_adapter()
420 adap->rc = NULL; in cec_unregister_adapter()
422 debugfs_remove_recursive(adap->cec_dir); in cec_unregister_adapter()
424 if (adap->notifier) in cec_unregister_adapter()
425 cec_notifier_unregister(adap->notifier); in cec_unregister_adapter()
427 cec_devnode_unregister(adap); in cec_unregister_adapter()
431 void cec_delete_adapter(struct cec_adapter *adap) in cec_delete_adapter() argument
433 if (IS_ERR_OR_NULL(adap)) in cec_delete_adapter()
435 kthread_stop(adap->kthread); in cec_delete_adapter()
436 if (adap->kthread_config) in cec_delete_adapter()
437 kthread_stop(adap->kthread_config); in cec_delete_adapter()
438 if (adap->ops->adap_free) in cec_delete_adapter()
439 adap->ops->adap_free(adap); in cec_delete_adapter()
441 rc_free_device(adap->rc); in cec_delete_adapter()
443 kfree(adap); in cec_delete_adapter()