Lines Matching refs:cd

247 typedef int (*ab_task_fn_t)(struct anybuss_host *cd,
249 typedef void (*ab_done_fn_t)(struct anybuss_host *cd);
316 static void __ab_task_finish(struct ab_task *t, struct anybuss_host *cd)
319 t->done_fn(cd);
324 ab_task_dequeue_finish_put(struct kfifo *q, struct anybuss_host *cd)
331 __ab_task_finish(t, cd);
390 static void reset_assert(struct anybuss_host *cd)
392 cd->reset(cd->dev, true);
395 static void reset_deassert(struct anybuss_host *cd)
397 cd->reset(cd->dev, false);
459 struct anybuss_host *cd = data;
466 * store the register value in cd->ind_ab (an atomic_t), so that the
470 ind_ab = read_ind_ab(cd->regmap);
473 atomic_set(&cd->ind_ab, ind_ab);
474 complete(&cd->card_boot);
475 wake_up(&cd->wq);
481 static int task_fn_power_off(struct anybuss_host *cd,
484 struct anybuss_client *client = cd->client;
486 if (!cd->power_on)
488 disable_irq(cd->irq);
489 reset_assert(cd);
490 atomic_set(&cd->ind_ab, IND_AB_UPDATED);
493 cd->power_on = false;
497 static int task_fn_power_on_2(struct anybuss_host *cd,
500 if (completion_done(&cd->card_boot)) {
501 cd->power_on = true;
505 disable_irq(cd->irq);
506 reset_assert(cd);
507 dev_err(cd->dev, "power on timed out");
513 static int task_fn_power_on(struct anybuss_host *cd,
518 if (cd->power_on)
524 regmap_read(cd->regmap, REG_IND_AB, &dummy);
525 reinit_completion(&cd->card_boot);
526 enable_irq(cd->irq);
527 reset_deassert(cd);
534 struct anybuss_host *cd = client->host;
538 t = ab_task_create_get(cd->qcache, power_on ?
542 err = ab_task_enqueue_wait(t, cd->powerq, &cd->qlock, &cd->wq);
550 static int task_fn_area_3(struct anybuss_host *cd, struct ab_task *t)
554 if (!cd->power_on)
556 if (atomic_read(&cd->ind_ab) & pd->flags) {
565 static int task_fn_area_2(struct anybuss_host *cd, struct ab_task *t)
571 if (!cd->power_on)
573 regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
574 if (!(atomic_read(&cd->ind_ab) & pd->flags)) {
577 dev_warn(cd->dev, "timeout waiting for area");
585 regmap_bulk_write(cd->regmap, pd->addr, pd->buf,
588 regmap_bulk_read(cd->regmap, pd->addr, pd->buf,
593 ret = write_ind_ap(cd->regmap, ind_ap);
600 static int task_fn_area(struct anybuss_host *cd, struct ab_task *t)
606 if (!cd->power_on)
608 regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
612 ret = write_ind_ap(cd->regmap, ind_ap);
696 static int task_fn_mbox_2(struct anybuss_host *cd, struct ab_task *t)
701 if (!cd->power_on)
703 regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
704 if (((atomic_read(&cd->ind_ab) ^ ind_ap) & IND_AX_MOUT) == 0) {
711 regmap_bulk_read(cd->regmap, MBOX_OUT_AREA, &pd->hdr,
713 regmap_bulk_read(cd->regmap, MBOX_OUT_AREA + sizeof(pd->hdr),
717 return write_ind_ap(cd->regmap, ind_ap);
720 static int task_fn_mbox(struct anybuss_host *cd, struct ab_task *t)
726 if (!cd->power_on)
728 regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
729 if ((atomic_read(&cd->ind_ab) ^ ind_ap) & IND_AX_MIN) {
736 regmap_bulk_write(cd->regmap, MBOX_IN_AREA, &pd->hdr,
738 regmap_bulk_write(cd->regmap, MBOX_IN_AREA + sizeof(pd->hdr),
742 ret = write_ind_ap(cd->regmap, ind_ap);
804 static int _anybus_mbox_cmd(struct anybuss_host *cd,
821 t = ab_task_create_get(cd->qcache, task_fn_mbox);
844 err = ab_task_enqueue_wait(t, cd->powerq, &cd->qlock, &cd->wq);
851 err = mbox_cmd_err(cd->dev, pd);
862 static void process_q(struct anybuss_host *cd, struct kfifo *q)
870 t->result = t->task_fn(cd, t);
872 ab_task_dequeue_finish_put(q, cd);
889 static void process_qs(struct anybuss_host *cd)
892 struct kfifo *qs = cd->qs;
893 size_t nqs = ARRAY_SIZE(cd->qs);
896 process_q(cd, qs);
899 static void softint_ack(struct anybuss_host *cd)
903 cd->softint_pending = false;
904 if (!cd->power_on)
906 regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
908 ind_ap |= atomic_read(&cd->ind_ab) & IND_AX_EVNT;
909 write_ind_ap(cd->regmap, ind_ap);
912 static void process_softint(struct anybuss_host *cd)
914 struct anybuss_client *client = cd->client;
920 if (!cd->power_on)
922 if (cd->softint_pending)
924 regmap_read(cd->regmap, REG_IND_AP, &ind_ap);
925 if (!((atomic_read(&cd->ind_ab) ^ ind_ap) & IND_AX_EVNT))
928 regmap_read(cd->regmap, REG_EVENT_CAUSE, &ev);
932 dev_dbg(cd->dev, "Fieldbus ON");
937 dev_dbg(cd->dev, "Fieldbus OFF");
942 dev_dbg(cd->dev, "Fieldbus data changed");
949 t = create_area_writer(cd->qcache, IND_AX_FBCTRL,
956 ret = ab_task_enqueue(t, cd->powerq, &cd->qlock, &cd->wq);
958 cd->softint_pending = true;
962 softint_ack(cd);
967 struct anybuss_host *cd = data;
968 struct kfifo *qs = cd->qs;
969 size_t nqs = ARRAY_SIZE(cd->qs);
979 * cd->ind_ab (an atomic_t), where we may safely access it, with the
988 ind_ab = atomic_read(&cd->ind_ab);
989 process_qs(cd);
990 process_softint(cd);
991 wait_event_timeout(cd->wq,
992 (atomic_read(&cd->ind_ab) != ind_ab) ||
1012 struct anybuss_host *cd = client->host;
1038 ret = _anybus_mbox_cmd(cd, CMD_START_INIT, false, NULL, 0,
1042 return _anybus_mbox_cmd(cd, CMD_ANYBUS_INIT, false,
1049 struct anybuss_host *cd = client->host;
1051 return _anybus_mbox_cmd(cd, CMD_END_INIT, false, NULL, 0,
1059 struct anybuss_host *cd = client->host;
1068 t = create_area_reader(cd->qcache, IND_AX_FBCTRL, addr, count);
1071 ret = ab_task_enqueue_wait(t, cd->powerq, &cd->qlock, &cd->wq);
1086 struct anybuss_host *cd = client->host;
1092 t = create_area_user_writer(cd->qcache, IND_AX_IN,
1096 ret = ab_task_enqueue_wait(t, cd->powerq, &cd->qlock, &cd->wq);
1111 struct anybuss_host *cd = client->host;
1117 t = create_area_reader(cd->qcache, IND_AX_OUT,
1121 ret = ab_task_enqueue_wait(t, cd->powerq, &cd->qlock, &cd->wq);
1139 struct anybuss_host *cd = client->host;
1141 return _anybus_mbox_cmd(cd, cmd_num, true, buf, count, NULL, 0,
1149 struct anybuss_host *cd = client->host;
1151 return _anybus_mbox_cmd(cd, cmd_num, true, NULL, 0, NULL, 0,
1159 struct anybuss_host *cd = client->host;
1161 return _anybus_mbox_cmd(cd, cmd_num, true, NULL, 0, buf, count,
1268 struct anybuss_host *cd;
1270 cd = devm_kzalloc(dev, sizeof(*cd), GFP_KERNEL);
1271 if (!cd)
1273 cd->dev = dev;
1274 cd->host_idx = ops->host_idx;
1275 init_completion(&cd->card_boot);
1276 init_waitqueue_head(&cd->wq);
1277 for (i = 0; i < ARRAY_SIZE(cd->qs); i++) {
1278 ret = taskq_alloc(dev, &cd->qs[i]);
1282 if (WARN_ON(ARRAY_SIZE(cd->qs) < 3))
1284 cd->powerq = &cd->qs[0];
1285 cd->mboxq = &cd->qs[1];
1286 cd->areaq = &cd->qs[2];
1287 cd->reset = ops->reset;
1288 if (!cd->reset)
1290 cd->regmap = ops->regmap;
1291 if (!cd->regmap)
1293 spin_lock_init(&cd->qlock);
1294 cd->qcache = kmem_cache_create(dev_name(dev),
1296 if (!cd->qcache)
1298 cd->irq = ops->irq;
1299 if (cd->irq <= 0) {
1307 reset_assert(cd);
1308 if (test_dpram(cd->regmap)) {
1313 ret = devm_request_threaded_irq(dev, cd->irq, NULL, irq_handler,
1314 IRQF_ONESHOT, dev_name(dev), cd);
1327 reset_deassert(cd);
1328 if (!wait_for_completion_timeout(&cd->card_boot, TIMEOUT)) {
1337 regmap_bulk_read(cd->regmap, REG_BOOTLOADER_V, val, 2);
1340 regmap_bulk_read(cd->regmap, REG_API_V, val, 2);
1342 regmap_bulk_read(cd->regmap, REG_FIELDBUS_V, val, 2);
1344 regmap_bulk_read(cd->regmap, REG_SERIAL_NO, val, 4);
1348 regmap_bulk_read(cd->regmap, REG_FIELDBUS_TYPE, &fieldbus_type,
1351 regmap_bulk_read(cd->regmap, REG_MODULE_SW_V, val, 2);
1355 disable_irq(cd->irq);
1356 reset_assert(cd);
1357 atomic_set(&cd->ind_ab, IND_AB_UPDATED);
1359 cd->qthread = kthread_run(qthread_fn, cd, dev_name(dev));
1360 if (IS_ERR(cd->qthread)) {
1362 ret = PTR_ERR(cd->qthread);
1369 cd->client = kzalloc(sizeof(*cd->client), GFP_KERNEL);
1370 if (!cd->client) {
1374 cd->client->anybus_id = fieldbus_type;
1375 cd->client->host = cd;
1376 cd->client->dev.bus = &anybus_bus;
1377 cd->client->dev.parent = dev;
1378 cd->client->dev.release = client_device_release;
1379 cd->client->dev.of_node =
1380 anybus_of_find_child_device(dev, cd->host_idx);
1381 dev_set_name(&cd->client->dev, "anybuss.card%d", cd->host_idx);
1382 ret = device_register(&cd->client->dev);
1385 return cd;
1387 put_device(&cd->client->dev);
1389 kthread_stop(cd->qthread);
1391 reset_assert(cd);
1393 kmem_cache_destroy(cd->qcache);
1400 struct anybuss_host *cd = host;
1402 device_unregister(&cd->client->dev);
1403 kthread_stop(cd->qthread);
1404 reset_assert(cd);
1405 kmem_cache_destroy(cd->qcache);