cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

tascam-proc.c (2147B)


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