xref: /openbmc/linux/sound/firewire/tascam/tascam-proc.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
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