162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Freescale QUICC Engine USB Host Controller Driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) Freescale Semicondutor, Inc. 2006. 662306a36Sopenharmony_ci * Shlomi Gridish <gridish@freescale.com> 762306a36Sopenharmony_ci * Jerry Huang <Chang-Ming.Huang@freescale.com> 862306a36Sopenharmony_ci * Copyright (c) Logic Product Development, Inc. 2007 962306a36Sopenharmony_ci * Peter Barada <peterb@logicpd.com> 1062306a36Sopenharmony_ci * Copyright (c) MontaVista Software, Inc. 2008. 1162306a36Sopenharmony_ci * Anton Vorontsov <avorontsov@ru.mvista.com> 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/kernel.h> 1562306a36Sopenharmony_ci#include <linux/errno.h> 1662306a36Sopenharmony_ci#include <linux/debugfs.h> 1762306a36Sopenharmony_ci#include <linux/seq_file.h> 1862306a36Sopenharmony_ci#include <linux/usb.h> 1962306a36Sopenharmony_ci#include <linux/usb/hcd.h> 2062306a36Sopenharmony_ci#include "fhci.h" 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_civoid fhci_dbg_isr(struct fhci_hcd *fhci, int usb_er) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci int i; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci if (usb_er == -1) { 2762306a36Sopenharmony_ci fhci->usb_irq_stat[12]++; 2862306a36Sopenharmony_ci return; 2962306a36Sopenharmony_ci } 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci for (i = 0; i < 12; ++i) { 3262306a36Sopenharmony_ci if (usb_er & (1 << i)) 3362306a36Sopenharmony_ci fhci->usb_irq_stat[i]++; 3462306a36Sopenharmony_ci } 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic int fhci_dfs_regs_show(struct seq_file *s, void *v) 3862306a36Sopenharmony_ci{ 3962306a36Sopenharmony_ci struct fhci_hcd *fhci = s->private; 4062306a36Sopenharmony_ci struct qe_usb_ctlr __iomem *regs = fhci->regs; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci seq_printf(s, 4362306a36Sopenharmony_ci "mode: 0x%x\n" "addr: 0x%x\n" 4462306a36Sopenharmony_ci "command: 0x%x\n" "ep0: 0x%x\n" 4562306a36Sopenharmony_ci "event: 0x%x\n" "mask: 0x%x\n" 4662306a36Sopenharmony_ci "status: 0x%x\n" "SOF timer: %d\n" 4762306a36Sopenharmony_ci "frame number: %d\n" 4862306a36Sopenharmony_ci "lines status: 0x%x\n", 4962306a36Sopenharmony_ci in_8(®s->usb_usmod), in_8(®s->usb_usadr), 5062306a36Sopenharmony_ci in_8(®s->usb_uscom), in_be16(®s->usb_usep[0]), 5162306a36Sopenharmony_ci in_be16(®s->usb_usber), in_be16(®s->usb_usbmr), 5262306a36Sopenharmony_ci in_8(®s->usb_usbs), in_be16(®s->usb_ussft), 5362306a36Sopenharmony_ci in_be16(®s->usb_usfrn), 5462306a36Sopenharmony_ci fhci_ioports_check_bus_state(fhci)); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci return 0; 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(fhci_dfs_regs); 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic int fhci_dfs_irq_stat_show(struct seq_file *s, void *v) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci struct fhci_hcd *fhci = s->private; 6362306a36Sopenharmony_ci int *usb_irq_stat = fhci->usb_irq_stat; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci seq_printf(s, 6662306a36Sopenharmony_ci "RXB: %d\n" "TXB: %d\n" "BSY: %d\n" 6762306a36Sopenharmony_ci "SOF: %d\n" "TXE0: %d\n" "TXE1: %d\n" 6862306a36Sopenharmony_ci "TXE2: %d\n" "TXE3: %d\n" "IDLE: %d\n" 6962306a36Sopenharmony_ci "RESET: %d\n" "SFT: %d\n" "MSF: %d\n" 7062306a36Sopenharmony_ci "IDLE_ONLY: %d\n", 7162306a36Sopenharmony_ci usb_irq_stat[0], usb_irq_stat[1], usb_irq_stat[2], 7262306a36Sopenharmony_ci usb_irq_stat[3], usb_irq_stat[4], usb_irq_stat[5], 7362306a36Sopenharmony_ci usb_irq_stat[6], usb_irq_stat[7], usb_irq_stat[8], 7462306a36Sopenharmony_ci usb_irq_stat[9], usb_irq_stat[10], usb_irq_stat[11], 7562306a36Sopenharmony_ci usb_irq_stat[12]); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci return 0; 7862306a36Sopenharmony_ci} 7962306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(fhci_dfs_irq_stat); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_civoid fhci_dfs_create(struct fhci_hcd *fhci) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci struct device *dev = fhci_to_hcd(fhci)->self.controller; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci fhci->dfs_root = debugfs_create_dir(dev_name(dev), usb_debug_root); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci debugfs_create_file("regs", S_IFREG | S_IRUGO, fhci->dfs_root, fhci, 8862306a36Sopenharmony_ci &fhci_dfs_regs_fops); 8962306a36Sopenharmony_ci debugfs_create_file("irq_stat", S_IFREG | S_IRUGO, fhci->dfs_root, fhci, 9062306a36Sopenharmony_ci &fhci_dfs_irq_stat_fops); 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_civoid fhci_dfs_destroy(struct fhci_hcd *fhci) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci debugfs_remove_recursive(fhci->dfs_root); 9662306a36Sopenharmony_ci} 97