162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * tascam-proc.h - a part of driver for TASCAM FireWire series 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2015 Takashi Sakamoto 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "./tascam.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistatic void proc_read_firmware(struct snd_info_entry *entry, 1162306a36Sopenharmony_ci struct snd_info_buffer *buffer) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci struct snd_tscm *tscm = entry->private_data; 1462306a36Sopenharmony_ci __be32 data; 1562306a36Sopenharmony_ci unsigned int reg, fpga, arm, hw; 1662306a36Sopenharmony_ci int err; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, 1962306a36Sopenharmony_ci TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_REGISTER, 2062306a36Sopenharmony_ci &data, sizeof(data), 0); 2162306a36Sopenharmony_ci if (err < 0) 2262306a36Sopenharmony_ci return; 2362306a36Sopenharmony_ci reg = be32_to_cpu(data); 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, 2662306a36Sopenharmony_ci TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_FPGA, 2762306a36Sopenharmony_ci &data, sizeof(data), 0); 2862306a36Sopenharmony_ci if (err < 0) 2962306a36Sopenharmony_ci return; 3062306a36Sopenharmony_ci fpga = be32_to_cpu(data); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, 3362306a36Sopenharmony_ci TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_ARM, 3462306a36Sopenharmony_ci &data, sizeof(data), 0); 3562306a36Sopenharmony_ci if (err < 0) 3662306a36Sopenharmony_ci return; 3762306a36Sopenharmony_ci arm = be32_to_cpu(data); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST, 4062306a36Sopenharmony_ci TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_HW, 4162306a36Sopenharmony_ci &data, sizeof(data), 0); 4262306a36Sopenharmony_ci if (err < 0) 4362306a36Sopenharmony_ci return; 4462306a36Sopenharmony_ci hw = be32_to_cpu(data); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci snd_iprintf(buffer, "Register: %d (0x%08x)\n", reg & 0xffff, reg); 4762306a36Sopenharmony_ci snd_iprintf(buffer, "FPGA: %d (0x%08x)\n", fpga & 0xffff, fpga); 4862306a36Sopenharmony_ci snd_iprintf(buffer, "ARM: %d (0x%08x)\n", arm & 0xffff, arm); 4962306a36Sopenharmony_ci snd_iprintf(buffer, "Hardware: %d (0x%08x)\n", hw >> 16, hw); 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic void add_node(struct snd_tscm *tscm, struct snd_info_entry *root, 5362306a36Sopenharmony_ci const char *name, 5462306a36Sopenharmony_ci void (*op)(struct snd_info_entry *e, 5562306a36Sopenharmony_ci struct snd_info_buffer *b)) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci struct snd_info_entry *entry; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci entry = snd_info_create_card_entry(tscm->card, name, root); 6062306a36Sopenharmony_ci if (entry) 6162306a36Sopenharmony_ci snd_info_set_text_ops(entry, tscm, op); 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_civoid snd_tscm_proc_init(struct snd_tscm *tscm) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci struct snd_info_entry *root; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci /* 6962306a36Sopenharmony_ci * All nodes are automatically removed at snd_card_disconnect(), 7062306a36Sopenharmony_ci * by following to link list. 7162306a36Sopenharmony_ci */ 7262306a36Sopenharmony_ci root = snd_info_create_card_entry(tscm->card, "firewire", 7362306a36Sopenharmony_ci tscm->card->proc_root); 7462306a36Sopenharmony_ci if (root == NULL) 7562306a36Sopenharmony_ci return; 7662306a36Sopenharmony_ci root->mode = S_IFDIR | 0555; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci add_node(tscm, root, "firmware", proc_read_firmware); 7962306a36Sopenharmony_ci} 80