Lines Matching +full:rc +full:- +full:map +full:- +full:name
1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (c) 2015-2016, IBM Corporation.
7 #include <linux/bt-bmc.h>
24 #define DEVICE_NAME "ipmi-bt-host"
62 struct regmap *map; member
81 int rc; in bt_inb() local
83 rc = regmap_read(bt_bmc->map, bt_bmc->offset + reg, &val); in bt_inb()
84 WARN(rc != 0, "regmap_read() failed: %d\n", rc); in bt_inb()
86 return rc == 0 ? (u8) val : 0; in bt_inb()
91 int rc; in bt_outb() local
93 rc = regmap_write(bt_bmc->map, bt_bmc->offset + reg, data); in bt_outb()
94 WARN(rc != 0, "regmap_write() failed: %d\n", rc); in bt_outb()
164 return container_of(file->private_data, struct bt_bmc, miscdev); in file_bt_bmc()
177 return -EBUSY; in bt_bmc_open()
205 if (wait_event_interruptible(bt_bmc->queue, in bt_bmc_read()
207 return -ERESTARTSYS; in bt_bmc_read()
209 mutex_lock(&bt_bmc->mutex); in bt_bmc_read()
212 ret = -EIO; in bt_bmc_read()
229 len = count - 1; in bt_bmc_read()
232 nread = min_t(ssize_t, len, sizeof(kbuffer) - len_byte); in bt_bmc_read()
237 ret = -EFAULT; in bt_bmc_read()
240 len -= nread; in bt_bmc_read()
249 mutex_unlock(&bt_bmc->mutex); in bt_bmc_read()
271 return -EINVAL; in bt_bmc_write()
279 if (wait_event_interruptible(bt_bmc->queue, in bt_bmc_write()
282 return -ERESTARTSYS; in bt_bmc_write()
284 mutex_lock(&bt_bmc->mutex); in bt_bmc_write()
288 ret = -EIO; in bt_bmc_write()
297 ret = -EFAULT; in bt_bmc_write()
303 count -= nwritten; in bt_bmc_write()
311 mutex_unlock(&bt_bmc->mutex); in bt_bmc_write()
325 return -EINVAL; in bt_bmc_ioctl()
343 poll_wait(file, &bt_bmc->queue, wait); in bt_bmc_poll()
370 bt_bmc->poll_timer.expires += msecs_to_jiffies(500); in poll_timer()
371 wake_up(&bt_bmc->queue); in poll_timer()
372 add_timer(&bt_bmc->poll_timer); in poll_timer()
379 int rc; in bt_bmc_irq() local
381 rc = regmap_read(bt_bmc->map, bt_bmc->offset + BT_CR2, ®); in bt_bmc_irq()
382 if (rc) in bt_bmc_irq()
390 regmap_write(bt_bmc->map, bt_bmc->offset + BT_CR2, reg); in bt_bmc_irq()
392 wake_up(&bt_bmc->queue); in bt_bmc_irq()
399 struct device *dev = &pdev->dev; in bt_bmc_config_irq()
400 int rc; in bt_bmc_config_irq() local
402 bt_bmc->irq = platform_get_irq_optional(pdev, 0); in bt_bmc_config_irq()
403 if (bt_bmc->irq < 0) in bt_bmc_config_irq()
404 return bt_bmc->irq; in bt_bmc_config_irq()
406 rc = devm_request_irq(dev, bt_bmc->irq, bt_bmc_irq, IRQF_SHARED, in bt_bmc_config_irq()
408 if (rc < 0) { in bt_bmc_config_irq()
409 dev_warn(dev, "Unable to request IRQ %d\n", bt_bmc->irq); in bt_bmc_config_irq()
410 bt_bmc->irq = rc; in bt_bmc_config_irq()
411 return rc; in bt_bmc_config_irq()
420 rc = regmap_update_bits(bt_bmc->map, bt_bmc->offset + BT_CR1, in bt_bmc_config_irq()
424 return rc; in bt_bmc_config_irq()
431 int rc; in bt_bmc_probe() local
433 dev = &pdev->dev; in bt_bmc_probe()
438 return -ENOMEM; in bt_bmc_probe()
440 dev_set_drvdata(&pdev->dev, bt_bmc); in bt_bmc_probe()
442 bt_bmc->map = syscon_node_to_regmap(pdev->dev.parent->of_node); in bt_bmc_probe()
443 if (IS_ERR(bt_bmc->map)) { in bt_bmc_probe()
447 * Assume it's not the MFD-based devicetree description, in in bt_bmc_probe()
454 bt_bmc->map = devm_regmap_init_mmio(dev, base, &bt_regmap_cfg); in bt_bmc_probe()
455 bt_bmc->offset = 0; in bt_bmc_probe()
457 rc = of_property_read_u32(dev->of_node, "reg", &bt_bmc->offset); in bt_bmc_probe()
458 if (rc) in bt_bmc_probe()
459 return rc; in bt_bmc_probe()
462 mutex_init(&bt_bmc->mutex); in bt_bmc_probe()
463 init_waitqueue_head(&bt_bmc->queue); in bt_bmc_probe()
465 bt_bmc->miscdev.minor = MISC_DYNAMIC_MINOR, in bt_bmc_probe()
466 bt_bmc->miscdev.name = DEVICE_NAME, in bt_bmc_probe()
467 bt_bmc->miscdev.fops = &bt_bmc_fops, in bt_bmc_probe()
468 bt_bmc->miscdev.parent = dev; in bt_bmc_probe()
469 rc = misc_register(&bt_bmc->miscdev); in bt_bmc_probe()
470 if (rc) { in bt_bmc_probe()
472 return rc; in bt_bmc_probe()
477 if (bt_bmc->irq >= 0) { in bt_bmc_probe()
478 dev_info(dev, "Using IRQ %d\n", bt_bmc->irq); in bt_bmc_probe()
481 timer_setup(&bt_bmc->poll_timer, poll_timer, 0); in bt_bmc_probe()
482 bt_bmc->poll_timer.expires = jiffies + msecs_to_jiffies(10); in bt_bmc_probe()
483 add_timer(&bt_bmc->poll_timer); in bt_bmc_probe()
486 regmap_write(bt_bmc->map, bt_bmc->offset + BT_CR0, in bt_bmc_probe()
500 struct bt_bmc *bt_bmc = dev_get_drvdata(&pdev->dev); in bt_bmc_remove()
502 misc_deregister(&bt_bmc->miscdev); in bt_bmc_remove()
503 if (bt_bmc->irq < 0) in bt_bmc_remove()
504 del_timer_sync(&bt_bmc->poll_timer); in bt_bmc_remove()
509 { .compatible = "aspeed,ast2400-ibt-bmc" },
510 { .compatible = "aspeed,ast2500-ibt-bmc" },
516 .name = DEVICE_NAME,