^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * tascam-proc.h - a part of driver for TASCAM FireWire series
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2015 Takashi Sakamoto
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "./tascam.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) static void proc_read_firmware(struct snd_info_entry *entry,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) struct snd_info_buffer *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) struct snd_tscm *tscm = entry->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) __be32 data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) unsigned int reg, fpga, arm, hw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_REGISTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) &data, sizeof(data), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) reg = be32_to_cpu(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_FPGA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) &data, sizeof(data), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) fpga = be32_to_cpu(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_ARM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) &data, sizeof(data), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) arm = be32_to_cpu(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_HW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) &data, sizeof(data), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) hw = be32_to_cpu(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) snd_iprintf(buffer, "Register: %d (0x%08x)\n", reg & 0xffff, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) snd_iprintf(buffer, "FPGA: %d (0x%08x)\n", fpga & 0xffff, fpga);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) snd_iprintf(buffer, "ARM: %d (0x%08x)\n", arm & 0xffff, arm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) snd_iprintf(buffer, "Hardware: %d (0x%08x)\n", hw >> 16, hw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) static void add_node(struct snd_tscm *tscm, struct snd_info_entry *root,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) const char *name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) void (*op)(struct snd_info_entry *e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct snd_info_buffer *b))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct snd_info_entry *entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) entry = snd_info_create_card_entry(tscm->card, name, root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) if (entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) snd_info_set_text_ops(entry, tscm, op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) void snd_tscm_proc_init(struct snd_tscm *tscm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct snd_info_entry *root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * All nodes are automatically removed at snd_card_disconnect(),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) * by following to link list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) root = snd_info_create_card_entry(tscm->card, "firewire",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) tscm->card->proc_root);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) if (root == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) root->mode = S_IFDIR | 0555;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) add_node(tscm, root, "firmware", proc_read_firmware);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) }