Lines Matching defs:bt_bmc
59 struct bt_bmc {
78 static u8 bt_inb(struct bt_bmc *bt_bmc, int reg)
83 rc = regmap_read(bt_bmc->map, bt_bmc->offset + reg, &val);
89 static void bt_outb(struct bt_bmc *bt_bmc, u8 data, int reg)
93 rc = regmap_write(bt_bmc->map, bt_bmc->offset + reg, data);
97 static void clr_rd_ptr(struct bt_bmc *bt_bmc)
99 bt_outb(bt_bmc, BT_CTRL_CLR_RD_PTR, BT_CTRL);
102 static void clr_wr_ptr(struct bt_bmc *bt_bmc)
104 bt_outb(bt_bmc, BT_CTRL_CLR_WR_PTR, BT_CTRL);
107 static void clr_h2b_atn(struct bt_bmc *bt_bmc)
109 bt_outb(bt_bmc, BT_CTRL_H2B_ATN, BT_CTRL);
112 static void set_b_busy(struct bt_bmc *bt_bmc)
114 if (!(bt_inb(bt_bmc, BT_CTRL) & BT_CTRL_B_BUSY))
115 bt_outb(bt_bmc, BT_CTRL_B_BUSY, BT_CTRL);
118 static void clr_b_busy(struct bt_bmc *bt_bmc)
120 if (bt_inb(bt_bmc, BT_CTRL) & BT_CTRL_B_BUSY)
121 bt_outb(bt_bmc, BT_CTRL_B_BUSY, BT_CTRL);
124 static void set_b2h_atn(struct bt_bmc *bt_bmc)
126 bt_outb(bt_bmc, BT_CTRL_B2H_ATN, BT_CTRL);
129 static u8 bt_read(struct bt_bmc *bt_bmc)
131 return bt_inb(bt_bmc, BT_BMC2HOST);
134 static ssize_t bt_readn(struct bt_bmc *bt_bmc, u8 *buf, size_t n)
139 buf[i] = bt_read(bt_bmc);
143 static void bt_write(struct bt_bmc *bt_bmc, u8 c)
145 bt_outb(bt_bmc, c, BT_BMC2HOST);
148 static ssize_t bt_writen(struct bt_bmc *bt_bmc, u8 *buf, size_t n)
153 bt_write(bt_bmc, buf[i]);
157 static void set_sms_atn(struct bt_bmc *bt_bmc)
159 bt_outb(bt_bmc, BT_CTRL_SMS_ATN, BT_CTRL);
162 static struct bt_bmc *file_bt_bmc(struct file *file)
164 return container_of(file->private_data, struct bt_bmc, miscdev);
169 struct bt_bmc *bt_bmc = file_bt_bmc(file);
172 clr_b_busy(bt_bmc);
196 struct bt_bmc *bt_bmc = file_bt_bmc(file);
205 if (wait_event_interruptible(bt_bmc->queue,
206 bt_inb(bt_bmc, BT_CTRL) & BT_CTRL_H2B_ATN))
209 mutex_lock(&bt_bmc->mutex);
211 if (unlikely(!(bt_inb(bt_bmc, BT_CTRL) & BT_CTRL_H2B_ATN))) {
216 set_b_busy(bt_bmc);
217 clr_h2b_atn(bt_bmc);
218 clr_rd_ptr(bt_bmc);
224 kbuffer[0] = bt_read(bt_bmc);
234 bt_readn(bt_bmc, kbuffer + len_byte, nread);
246 clr_b_busy(bt_bmc);
249 mutex_unlock(&bt_bmc->mutex);
262 struct bt_bmc *bt_bmc = file_bt_bmc(file);
279 if (wait_event_interruptible(bt_bmc->queue,
280 !(bt_inb(bt_bmc, BT_CTRL) &
284 mutex_lock(&bt_bmc->mutex);
286 if (unlikely(bt_inb(bt_bmc, BT_CTRL) &
292 clr_wr_ptr(bt_bmc);
301 bt_writen(bt_bmc, kbuffer, nwritten);
308 set_b2h_atn(bt_bmc);
311 mutex_unlock(&bt_bmc->mutex);
318 struct bt_bmc *bt_bmc = file_bt_bmc(file);
322 set_sms_atn(bt_bmc);
330 struct bt_bmc *bt_bmc = file_bt_bmc(file);
333 set_b_busy(bt_bmc);
339 struct bt_bmc *bt_bmc = file_bt_bmc(file);
343 poll_wait(file, &bt_bmc->queue, wait);
345 ctrl = bt_inb(bt_bmc, BT_CTRL);
368 struct bt_bmc *bt_bmc = from_timer(bt_bmc, t, poll_timer);
370 bt_bmc->poll_timer.expires += msecs_to_jiffies(500);
371 wake_up(&bt_bmc->queue);
372 add_timer(&bt_bmc->poll_timer);
377 struct bt_bmc *bt_bmc = arg;
381 rc = regmap_read(bt_bmc->map, bt_bmc->offset + BT_CR2, ®);
390 regmap_write(bt_bmc->map, bt_bmc->offset + BT_CR2, reg);
392 wake_up(&bt_bmc->queue);
396 static int bt_bmc_config_irq(struct bt_bmc *bt_bmc,
402 bt_bmc->irq = platform_get_irq_optional(pdev, 0);
403 if (bt_bmc->irq < 0)
404 return bt_bmc->irq;
406 rc = devm_request_irq(dev, bt_bmc->irq, bt_bmc_irq, IRQF_SHARED,
407 DEVICE_NAME, bt_bmc);
409 dev_warn(dev, "Unable to request IRQ %d\n", bt_bmc->irq);
410 bt_bmc->irq = rc;
420 rc = regmap_update_bits(bt_bmc->map, bt_bmc->offset + BT_CR1,
429 struct bt_bmc *bt_bmc;
436 bt_bmc = devm_kzalloc(dev, sizeof(*bt_bmc), GFP_KERNEL);
437 if (!bt_bmc)
440 dev_set_drvdata(&pdev->dev, bt_bmc);
442 bt_bmc->map = syscon_node_to_regmap(pdev->dev.parent->of_node);
443 if (IS_ERR(bt_bmc->map)) {
454 bt_bmc->map = devm_regmap_init_mmio(dev, base, &bt_regmap_cfg);
455 bt_bmc->offset = 0;
457 rc = of_property_read_u32(dev->of_node, "reg", &bt_bmc->offset);
462 mutex_init(&bt_bmc->mutex);
463 init_waitqueue_head(&bt_bmc->queue);
465 bt_bmc->miscdev.minor = MISC_DYNAMIC_MINOR,
466 bt_bmc->miscdev.name = DEVICE_NAME,
467 bt_bmc->miscdev.fops = &bt_bmc_fops,
468 bt_bmc->miscdev.parent = dev;
469 rc = misc_register(&bt_bmc->miscdev);
475 bt_bmc_config_irq(bt_bmc, pdev);
477 if (bt_bmc->irq >= 0) {
478 dev_info(dev, "Using IRQ %d\n", bt_bmc->irq);
481 timer_setup(&bt_bmc->poll_timer, poll_timer, 0);
482 bt_bmc->poll_timer.expires = jiffies + msecs_to_jiffies(10);
483 add_timer(&bt_bmc->poll_timer);
486 regmap_write(bt_bmc->map, bt_bmc->offset + BT_CR0,
493 clr_b_busy(bt_bmc);
500 struct bt_bmc *bt_bmc = dev_get_drvdata(&pdev->dev);
502 misc_deregister(&bt_bmc->miscdev);
503 if (bt_bmc->irq < 0)
504 del_timer_sync(&bt_bmc->poll_timer);