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