moxtet 126 drivers/bus/moxtet.c if (mdev->moxtet == new_dev->moxtet && mdev->id == new_dev->id && moxtet 136 drivers/bus/moxtet.c put_device(mdev->moxtet->dev); moxtet 141 drivers/bus/moxtet.c moxtet_alloc_device(struct moxtet *moxtet) moxtet 145 drivers/bus/moxtet.c if (!get_device(moxtet->dev)) moxtet 150 drivers/bus/moxtet.c put_device(moxtet->dev); moxtet 154 drivers/bus/moxtet.c dev->moxtet = moxtet; moxtet 155 drivers/bus/moxtet.c dev->dev.parent = moxtet->dev; moxtet 184 drivers/bus/moxtet.c dev_err(dev->moxtet->dev, "can't add %s, status %d\n", moxtet 185 drivers/bus/moxtet.c dev_name(dev->moxtet->dev), ret); moxtet 205 drivers/bus/moxtet.c of_register_moxtet_device(struct moxtet *moxtet, struct device_node *nc) moxtet 211 drivers/bus/moxtet.c dev = moxtet_alloc_device(moxtet); moxtet 213 drivers/bus/moxtet.c dev_err(moxtet->dev, moxtet 220 drivers/bus/moxtet.c dev_err(moxtet->dev, "%pOF has no valid 'reg' property (%d)\n", moxtet 228 drivers/bus/moxtet.c dev_err(moxtet->dev, "%pOF Moxtet address 0x%x out of range\n", moxtet 234 drivers/bus/moxtet.c dev->id = moxtet->modules[dev->idx]; moxtet 237 drivers/bus/moxtet.c dev_err(moxtet->dev, "%pOF Moxtet address 0x%x is empty\n", nc, moxtet 248 drivers/bus/moxtet.c dev_err(moxtet->dev, moxtet 261 drivers/bus/moxtet.c static void of_register_moxtet_devices(struct moxtet *moxtet) moxtet 266 drivers/bus/moxtet.c if (!moxtet->dev->of_node) moxtet 269 drivers/bus/moxtet.c for_each_available_child_of_node(moxtet->dev->of_node, nc) { moxtet 272 drivers/bus/moxtet.c dev = of_register_moxtet_device(moxtet, nc); moxtet 274 drivers/bus/moxtet.c dev_warn(moxtet->dev, moxtet 283 drivers/bus/moxtet.c moxtet_register_devices_from_topology(struct moxtet *moxtet) moxtet 288 drivers/bus/moxtet.c for (i = 0; i < moxtet->count; ++i) { moxtet 289 drivers/bus/moxtet.c dev = moxtet_alloc_device(moxtet); moxtet 291 drivers/bus/moxtet.c dev_err(moxtet->dev, "Moxtet device %u alloc error\n", moxtet 297 drivers/bus/moxtet.c dev->id = moxtet->modules[i]; moxtet 302 drivers/bus/moxtet.c dev_err(moxtet->dev, moxtet 312 drivers/bus/moxtet.c static int moxtet_set_irq(struct moxtet *moxtet, int idx, int id, int nsame) moxtet 324 drivers/bus/moxtet.c pos = &moxtet->irq.position[first + i]; moxtet 327 drivers/bus/moxtet.c moxtet->irq.exists |= BIT(first + i); moxtet 333 drivers/bus/moxtet.c static int moxtet_find_topology(struct moxtet *moxtet) moxtet 341 drivers/bus/moxtet.c ret = spi_read(to_spi_device(moxtet->dev), buf, TURRIS_MOX_MAX_MODULES); moxtet 346 drivers/bus/moxtet.c dev_info(moxtet->dev, "Found MOX A (eMMC CPU) module\n"); moxtet 348 drivers/bus/moxtet.c dev_info(moxtet->dev, "Found MOX A (CPU) module\n"); moxtet 350 drivers/bus/moxtet.c dev_err(moxtet->dev, "Invalid Turris MOX A CPU module 0x%02x\n", moxtet 355 drivers/bus/moxtet.c moxtet->count = 0; moxtet 365 drivers/bus/moxtet.c moxtet->modules[i-1] = id; moxtet 366 drivers/bus/moxtet.c ++moxtet->count; moxtet 369 drivers/bus/moxtet.c dev_info(moxtet->dev, "Found %s module\n", moxtet 372 drivers/bus/moxtet.c if (moxtet_set_irq(moxtet, i-1, id, cnts[id]++) < 0) moxtet 373 drivers/bus/moxtet.c dev_err(moxtet->dev, moxtet 377 drivers/bus/moxtet.c dev_warn(moxtet->dev, moxtet 386 drivers/bus/moxtet.c static int moxtet_spi_read(struct moxtet *moxtet, u8 *buf) moxtet 390 drivers/bus/moxtet.c .tx_buf = moxtet->tx, moxtet 391 drivers/bus/moxtet.c .len = moxtet->count + 1 moxtet 395 drivers/bus/moxtet.c mutex_lock(&moxtet->lock); moxtet 397 drivers/bus/moxtet.c ret = spi_sync_transfer(to_spi_device(moxtet->dev), &xfer, 1); moxtet 399 drivers/bus/moxtet.c mutex_unlock(&moxtet->lock); moxtet 407 drivers/bus/moxtet.c struct moxtet *moxtet = mdev->moxtet; moxtet 411 drivers/bus/moxtet.c if (mdev->idx >= moxtet->count) moxtet 414 drivers/bus/moxtet.c ret = moxtet_spi_read(moxtet, buf); moxtet 425 drivers/bus/moxtet.c struct moxtet *moxtet = mdev->moxtet; moxtet 428 drivers/bus/moxtet.c if (mdev->idx >= moxtet->count) moxtet 431 drivers/bus/moxtet.c mutex_lock(&moxtet->lock); moxtet 433 drivers/bus/moxtet.c moxtet->tx[moxtet->count - mdev->idx] = val; moxtet 435 drivers/bus/moxtet.c ret = spi_write(to_spi_device(moxtet->dev), moxtet->tx, moxtet 436 drivers/bus/moxtet.c moxtet->count + 1); moxtet 438 drivers/bus/moxtet.c mutex_unlock(&moxtet->lock); moxtet 447 drivers/bus/moxtet.c struct moxtet *moxtet = mdev->moxtet; moxtet 449 drivers/bus/moxtet.c if (mdev->idx >= moxtet->count) moxtet 452 drivers/bus/moxtet.c return moxtet->tx[moxtet->count - mdev->idx]; moxtet 467 drivers/bus/moxtet.c struct moxtet *moxtet = file->private_data; moxtet 472 drivers/bus/moxtet.c ret = moxtet_spi_read(moxtet, bin); moxtet 476 drivers/bus/moxtet.c n = moxtet->count + 1; moxtet 494 drivers/bus/moxtet.c struct moxtet *moxtet = file->private_data; moxtet 499 drivers/bus/moxtet.c mutex_lock(&moxtet->lock); moxtet 501 drivers/bus/moxtet.c for (i = 0; i < moxtet->count; ++i) moxtet 502 drivers/bus/moxtet.c p = hex_byte_pack(p, moxtet->tx[moxtet->count - i]); moxtet 504 drivers/bus/moxtet.c mutex_unlock(&moxtet->lock); moxtet 514 drivers/bus/moxtet.c struct moxtet *moxtet = file->private_data; moxtet 521 drivers/bus/moxtet.c if (len > 2 * moxtet->count + 1 || len < 2 * moxtet->count) moxtet 531 drivers/bus/moxtet.c err = hex2bin(bin, hex, moxtet->count); moxtet 535 drivers/bus/moxtet.c mutex_lock(&moxtet->lock); moxtet 537 drivers/bus/moxtet.c for (i = 0; i < moxtet->count; ++i) moxtet 538 drivers/bus/moxtet.c moxtet->tx[moxtet->count - i] = bin[i]; moxtet 540 drivers/bus/moxtet.c err = spi_write(to_spi_device(moxtet->dev), moxtet->tx, moxtet 541 drivers/bus/moxtet.c moxtet->count + 1); moxtet 543 drivers/bus/moxtet.c mutex_unlock(&moxtet->lock); moxtet 556 drivers/bus/moxtet.c static int moxtet_register_debugfs(struct moxtet *moxtet) moxtet 565 drivers/bus/moxtet.c entry = debugfs_create_file_unsafe("input", 0444, root, moxtet, moxtet 570 drivers/bus/moxtet.c entry = debugfs_create_file_unsafe("output", 0644, root, moxtet, moxtet 575 drivers/bus/moxtet.c moxtet->debugfs_root = root; moxtet 583 drivers/bus/moxtet.c static void moxtet_unregister_debugfs(struct moxtet *moxtet) moxtet 585 drivers/bus/moxtet.c debugfs_remove_recursive(moxtet->debugfs_root); moxtet 588 drivers/bus/moxtet.c static inline int moxtet_register_debugfs(struct moxtet *moxtet) moxtet 593 drivers/bus/moxtet.c static inline void moxtet_unregister_debugfs(struct moxtet *moxtet) moxtet 601 drivers/bus/moxtet.c struct moxtet *moxtet = d->host_data; moxtet 603 drivers/bus/moxtet.c if (hw >= MOXTET_NIRQS || !(moxtet->irq.exists & BIT(hw))) { moxtet 604 drivers/bus/moxtet.c dev_err(moxtet->dev, "Invalid hw irq number\n"); moxtet 609 drivers/bus/moxtet.c irq_set_chip_and_handler(irq, &moxtet->irq.chip, handle_level_irq); moxtet 620 drivers/bus/moxtet.c struct moxtet *moxtet = d->host_data; moxtet 628 drivers/bus/moxtet.c if (irq >= MOXTET_NIRQS || !(moxtet->irq.exists & BIT(irq))) moxtet 643 drivers/bus/moxtet.c struct moxtet *moxtet = irq_data_get_irq_chip_data(d); moxtet 645 drivers/bus/moxtet.c moxtet->irq.masked |= BIT(d->hwirq); moxtet 650 drivers/bus/moxtet.c struct moxtet *moxtet = irq_data_get_irq_chip_data(d); moxtet 652 drivers/bus/moxtet.c moxtet->irq.masked &= ~BIT(d->hwirq); moxtet 657 drivers/bus/moxtet.c struct moxtet *moxtet = irq_data_get_irq_chip_data(d); moxtet 658 drivers/bus/moxtet.c struct moxtet_irqpos *pos = &moxtet->irq.position[d->hwirq]; moxtet 661 drivers/bus/moxtet.c id = moxtet->modules[pos->idx]; moxtet 674 drivers/bus/moxtet.c static int moxtet_irq_read(struct moxtet *moxtet, unsigned long *map) moxtet 676 drivers/bus/moxtet.c struct moxtet_irqpos *pos = moxtet->irq.position; moxtet 680 drivers/bus/moxtet.c ret = moxtet_spi_read(moxtet, buf); moxtet 686 drivers/bus/moxtet.c for_each_set_bit(i, &moxtet->irq.exists, MOXTET_NIRQS) { moxtet 696 drivers/bus/moxtet.c struct moxtet *moxtet = data; moxtet 700 drivers/bus/moxtet.c ret = moxtet_irq_read(moxtet, &set); moxtet 704 drivers/bus/moxtet.c set &= ~moxtet->irq.masked; moxtet 708 drivers/bus/moxtet.c sub_irq = irq_find_mapping(moxtet->irq.domain, i); moxtet 710 drivers/bus/moxtet.c dev_dbg(moxtet->dev, "%i irq\n", i); moxtet 714 drivers/bus/moxtet.c ret = moxtet_irq_read(moxtet, &set); moxtet 718 drivers/bus/moxtet.c set &= ~moxtet->irq.masked; moxtet 725 drivers/bus/moxtet.c static void moxtet_irq_free(struct moxtet *moxtet) moxtet 730 drivers/bus/moxtet.c if (moxtet->irq.exists & BIT(i)) { moxtet 731 drivers/bus/moxtet.c irq = irq_find_mapping(moxtet->irq.domain, i); moxtet 736 drivers/bus/moxtet.c irq_domain_remove(moxtet->irq.domain); moxtet 739 drivers/bus/moxtet.c static int moxtet_irq_setup(struct moxtet *moxtet) moxtet 743 drivers/bus/moxtet.c moxtet->irq.domain = irq_domain_add_simple(moxtet->dev->of_node, moxtet 745 drivers/bus/moxtet.c &moxtet_irq_domain, moxtet); moxtet 746 drivers/bus/moxtet.c if (moxtet->irq.domain == NULL) { moxtet 747 drivers/bus/moxtet.c dev_err(moxtet->dev, "Could not add IRQ domain\n"); moxtet 752 drivers/bus/moxtet.c if (moxtet->irq.exists & BIT(i)) moxtet 753 drivers/bus/moxtet.c irq_create_mapping(moxtet->irq.domain, i); moxtet 755 drivers/bus/moxtet.c moxtet->irq.chip = moxtet_irq_chip; moxtet 756 drivers/bus/moxtet.c moxtet->irq.masked = ~0; moxtet 758 drivers/bus/moxtet.c ret = request_threaded_irq(moxtet->dev_irq, NULL, moxtet_irq_thread_fn, moxtet 759 drivers/bus/moxtet.c IRQF_ONESHOT, "moxtet", moxtet); moxtet 766 drivers/bus/moxtet.c moxtet_irq_free(moxtet); moxtet 772 drivers/bus/moxtet.c struct moxtet *moxtet; moxtet 779 drivers/bus/moxtet.c moxtet = devm_kzalloc(&spi->dev, sizeof(struct moxtet), moxtet 781 drivers/bus/moxtet.c if (!moxtet) moxtet 784 drivers/bus/moxtet.c moxtet->dev = &spi->dev; moxtet 785 drivers/bus/moxtet.c spi_set_drvdata(spi, moxtet); moxtet 787 drivers/bus/moxtet.c mutex_init(&moxtet->lock); moxtet 789 drivers/bus/moxtet.c moxtet->dev_irq = of_irq_get(moxtet->dev->of_node, 0); moxtet 790 drivers/bus/moxtet.c if (moxtet->dev_irq == -EPROBE_DEFER) moxtet 793 drivers/bus/moxtet.c if (moxtet->dev_irq <= 0) { moxtet 794 drivers/bus/moxtet.c dev_err(moxtet->dev, "No IRQ resource found\n"); moxtet 798 drivers/bus/moxtet.c ret = moxtet_find_topology(moxtet); moxtet 802 drivers/bus/moxtet.c if (moxtet->irq.exists) { moxtet 803 drivers/bus/moxtet.c ret = moxtet_irq_setup(moxtet); moxtet 808 drivers/bus/moxtet.c of_register_moxtet_devices(moxtet); moxtet 809 drivers/bus/moxtet.c moxtet_register_devices_from_topology(moxtet); moxtet 811 drivers/bus/moxtet.c ret = moxtet_register_debugfs(moxtet); moxtet 813 drivers/bus/moxtet.c dev_warn(moxtet->dev, "Failed creating debugfs entries: %i\n", moxtet 821 drivers/bus/moxtet.c struct moxtet *moxtet = spi_get_drvdata(spi); moxtet 823 drivers/bus/moxtet.c free_irq(moxtet->dev_irq, moxtet); moxtet 825 drivers/bus/moxtet.c moxtet_irq_free(moxtet); moxtet 827 drivers/bus/moxtet.c moxtet_unregister_debugfs(moxtet); moxtet 829 drivers/bus/moxtet.c device_for_each_child(moxtet->dev, NULL, __unregister); moxtet 831 drivers/bus/moxtet.c mutex_destroy(&moxtet->lock); moxtet 92 include/linux/moxtet.h struct moxtet *moxtet;