1*da607e19SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
296e5fbb0STakashi Sakamoto /*
396e5fbb0STakashi Sakamoto * tascam-proc.h - a part of driver for TASCAM FireWire series
496e5fbb0STakashi Sakamoto *
596e5fbb0STakashi Sakamoto * Copyright (c) 2015 Takashi Sakamoto
696e5fbb0STakashi Sakamoto */
796e5fbb0STakashi Sakamoto
896e5fbb0STakashi Sakamoto #include "./tascam.h"
996e5fbb0STakashi Sakamoto
proc_read_firmware(struct snd_info_entry * entry,struct snd_info_buffer * buffer)1096e5fbb0STakashi Sakamoto static void proc_read_firmware(struct snd_info_entry *entry,
1196e5fbb0STakashi Sakamoto struct snd_info_buffer *buffer)
1296e5fbb0STakashi Sakamoto {
1396e5fbb0STakashi Sakamoto struct snd_tscm *tscm = entry->private_data;
1496e5fbb0STakashi Sakamoto __be32 data;
1596e5fbb0STakashi Sakamoto unsigned int reg, fpga, arm, hw;
1696e5fbb0STakashi Sakamoto int err;
1796e5fbb0STakashi Sakamoto
1896e5fbb0STakashi Sakamoto err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST,
1996e5fbb0STakashi Sakamoto TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_REGISTER,
2096e5fbb0STakashi Sakamoto &data, sizeof(data), 0);
2196e5fbb0STakashi Sakamoto if (err < 0)
2296e5fbb0STakashi Sakamoto return;
2396e5fbb0STakashi Sakamoto reg = be32_to_cpu(data);
2496e5fbb0STakashi Sakamoto
2596e5fbb0STakashi Sakamoto err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST,
2696e5fbb0STakashi Sakamoto TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_FPGA,
2796e5fbb0STakashi Sakamoto &data, sizeof(data), 0);
2896e5fbb0STakashi Sakamoto if (err < 0)
2996e5fbb0STakashi Sakamoto return;
3096e5fbb0STakashi Sakamoto fpga = be32_to_cpu(data);
3196e5fbb0STakashi Sakamoto
3296e5fbb0STakashi Sakamoto err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST,
3396e5fbb0STakashi Sakamoto TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_ARM,
3496e5fbb0STakashi Sakamoto &data, sizeof(data), 0);
3596e5fbb0STakashi Sakamoto if (err < 0)
3696e5fbb0STakashi Sakamoto return;
3796e5fbb0STakashi Sakamoto arm = be32_to_cpu(data);
3896e5fbb0STakashi Sakamoto
3996e5fbb0STakashi Sakamoto err = snd_fw_transaction(tscm->unit, TCODE_READ_QUADLET_REQUEST,
4096e5fbb0STakashi Sakamoto TSCM_ADDR_BASE + TSCM_OFFSET_FIRMWARE_HW,
4196e5fbb0STakashi Sakamoto &data, sizeof(data), 0);
4296e5fbb0STakashi Sakamoto if (err < 0)
4396e5fbb0STakashi Sakamoto return;
4496e5fbb0STakashi Sakamoto hw = be32_to_cpu(data);
4596e5fbb0STakashi Sakamoto
4696e5fbb0STakashi Sakamoto snd_iprintf(buffer, "Register: %d (0x%08x)\n", reg & 0xffff, reg);
4796e5fbb0STakashi Sakamoto snd_iprintf(buffer, "FPGA: %d (0x%08x)\n", fpga & 0xffff, fpga);
4896e5fbb0STakashi Sakamoto snd_iprintf(buffer, "ARM: %d (0x%08x)\n", arm & 0xffff, arm);
4996e5fbb0STakashi Sakamoto snd_iprintf(buffer, "Hardware: %d (0x%08x)\n", hw >> 16, hw);
5096e5fbb0STakashi Sakamoto }
5196e5fbb0STakashi Sakamoto
add_node(struct snd_tscm * tscm,struct snd_info_entry * root,const char * name,void (* op)(struct snd_info_entry * e,struct snd_info_buffer * b))5296e5fbb0STakashi Sakamoto static void add_node(struct snd_tscm *tscm, struct snd_info_entry *root,
5396e5fbb0STakashi Sakamoto const char *name,
5496e5fbb0STakashi Sakamoto void (*op)(struct snd_info_entry *e,
5596e5fbb0STakashi Sakamoto struct snd_info_buffer *b))
5696e5fbb0STakashi Sakamoto {
5796e5fbb0STakashi Sakamoto struct snd_info_entry *entry;
5896e5fbb0STakashi Sakamoto
5996e5fbb0STakashi Sakamoto entry = snd_info_create_card_entry(tscm->card, name, root);
600c298bdcSTakashi Iwai if (entry)
6196e5fbb0STakashi Sakamoto snd_info_set_text_ops(entry, tscm, op);
6296e5fbb0STakashi Sakamoto }
6396e5fbb0STakashi Sakamoto
snd_tscm_proc_init(struct snd_tscm * tscm)6496e5fbb0STakashi Sakamoto void snd_tscm_proc_init(struct snd_tscm *tscm)
6596e5fbb0STakashi Sakamoto {
6696e5fbb0STakashi Sakamoto struct snd_info_entry *root;
6796e5fbb0STakashi Sakamoto
6896e5fbb0STakashi Sakamoto /*
6996e5fbb0STakashi Sakamoto * All nodes are automatically removed at snd_card_disconnect(),
7096e5fbb0STakashi Sakamoto * by following to link list.
7196e5fbb0STakashi Sakamoto */
7296e5fbb0STakashi Sakamoto root = snd_info_create_card_entry(tscm->card, "firewire",
7396e5fbb0STakashi Sakamoto tscm->card->proc_root);
7496e5fbb0STakashi Sakamoto if (root == NULL)
7596e5fbb0STakashi Sakamoto return;
766a73cf46SJoe Perches root->mode = S_IFDIR | 0555;
7796e5fbb0STakashi Sakamoto
7896e5fbb0STakashi Sakamoto add_node(tscm, root, "firmware", proc_read_firmware);
7996e5fbb0STakashi Sakamoto }
80