diff options
Diffstat (limited to 'drivers/usb/dwc2/debugfs.c')
-rw-r--r-- | drivers/usb/dwc2/debugfs.c | 182 |
1 files changed, 169 insertions, 13 deletions
diff --git a/drivers/usb/dwc2/debugfs.c b/drivers/usb/dwc2/debugfs.c index 0a130916a91c..794b959a7c8c 100644 --- a/drivers/usb/dwc2/debugfs.c +++ b/drivers/usb/dwc2/debugfs.c | |||
@@ -137,7 +137,7 @@ static int state_show(struct seq_file *seq, void *v) | |||
137 | int idx; | 137 | int idx; |
138 | 138 | ||
139 | seq_printf(seq, "DCFG=0x%08x, DCTL=0x%08x, DSTS=0x%08x\n", | 139 | seq_printf(seq, "DCFG=0x%08x, DCTL=0x%08x, DSTS=0x%08x\n", |
140 | dwc2_readl(regs + DCFG), | 140 | dwc2_readl(regs + DCFG), |
141 | dwc2_readl(regs + DCTL), | 141 | dwc2_readl(regs + DCTL), |
142 | dwc2_readl(regs + DSTS)); | 142 | dwc2_readl(regs + DSTS)); |
143 | 143 | ||
@@ -338,23 +338,23 @@ static void dwc2_hsotg_create_debug(struct dwc2_hsotg *hsotg) | |||
338 | { | 338 | { |
339 | struct dentry *root; | 339 | struct dentry *root; |
340 | struct dentry *file; | 340 | struct dentry *file; |
341 | unsigned epidx; | 341 | unsigned int epidx; |
342 | 342 | ||
343 | root = hsotg->debug_root; | 343 | root = hsotg->debug_root; |
344 | 344 | ||
345 | /* create general state file */ | 345 | /* create general state file */ |
346 | 346 | ||
347 | file = debugfs_create_file("state", S_IRUGO, root, hsotg, &state_fops); | 347 | file = debugfs_create_file("state", 0444, root, hsotg, &state_fops); |
348 | if (IS_ERR(file)) | 348 | if (IS_ERR(file)) |
349 | dev_err(hsotg->dev, "%s: failed to create state\n", __func__); | 349 | dev_err(hsotg->dev, "%s: failed to create state\n", __func__); |
350 | 350 | ||
351 | file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root, hsotg, | 351 | file = debugfs_create_file("testmode", 0644, root, hsotg, |
352 | &testmode_fops); | 352 | &testmode_fops); |
353 | if (IS_ERR(file)) | 353 | if (IS_ERR(file)) |
354 | dev_err(hsotg->dev, "%s: failed to create testmode\n", | 354 | dev_err(hsotg->dev, "%s: failed to create testmode\n", |
355 | __func__); | 355 | __func__); |
356 | 356 | ||
357 | file = debugfs_create_file("fifo", S_IRUGO, root, hsotg, &fifo_fops); | 357 | file = debugfs_create_file("fifo", 0444, root, hsotg, &fifo_fops); |
358 | if (IS_ERR(file)) | 358 | if (IS_ERR(file)) |
359 | dev_err(hsotg->dev, "%s: failed to create fifo\n", __func__); | 359 | dev_err(hsotg->dev, "%s: failed to create fifo\n", __func__); |
360 | 360 | ||
@@ -364,8 +364,8 @@ static void dwc2_hsotg_create_debug(struct dwc2_hsotg *hsotg) | |||
364 | 364 | ||
365 | ep = hsotg->eps_out[epidx]; | 365 | ep = hsotg->eps_out[epidx]; |
366 | if (ep) { | 366 | if (ep) { |
367 | file = debugfs_create_file(ep->name, S_IRUGO, | 367 | file = debugfs_create_file(ep->name, 0444, |
368 | root, ep, &ep_fops); | 368 | root, ep, &ep_fops); |
369 | if (IS_ERR(file)) | 369 | if (IS_ERR(file)) |
370 | dev_err(hsotg->dev, "failed to create %s debug file\n", | 370 | dev_err(hsotg->dev, "failed to create %s debug file\n", |
371 | ep->name); | 371 | ep->name); |
@@ -377,8 +377,8 @@ static void dwc2_hsotg_create_debug(struct dwc2_hsotg *hsotg) | |||
377 | 377 | ||
378 | ep = hsotg->eps_in[epidx]; | 378 | ep = hsotg->eps_in[epidx]; |
379 | if (ep) { | 379 | if (ep) { |
380 | file = debugfs_create_file(ep->name, S_IRUGO, | 380 | file = debugfs_create_file(ep->name, 0444, |
381 | root, ep, &ep_fops); | 381 | root, ep, &ep_fops); |
382 | if (IS_ERR(file)) | 382 | if (IS_ERR(file)) |
383 | dev_err(hsotg->dev, "failed to create %s debug file\n", | 383 | dev_err(hsotg->dev, "failed to create %s debug file\n", |
384 | ep->name); | 384 | ep->name); |
@@ -725,6 +725,143 @@ static const struct debugfs_reg32 dwc2_regs[] = { | |||
725 | dump_register(HCDMAB(15)), | 725 | dump_register(HCDMAB(15)), |
726 | }; | 726 | }; |
727 | 727 | ||
728 | #define print_param(_seq, _ptr, _param) \ | ||
729 | seq_printf((_seq), "%-30s: %d\n", #_param, (_ptr)->_param) | ||
730 | |||
731 | #define print_param_hex(_seq, _ptr, _param) \ | ||
732 | seq_printf((_seq), "%-30s: 0x%x\n", #_param, (_ptr)->_param) | ||
733 | |||
734 | static int params_show(struct seq_file *seq, void *v) | ||
735 | { | ||
736 | struct dwc2_hsotg *hsotg = seq->private; | ||
737 | struct dwc2_core_params *p = &hsotg->params; | ||
738 | int i; | ||
739 | |||
740 | print_param(seq, p, otg_cap); | ||
741 | print_param(seq, p, dma_desc_enable); | ||
742 | print_param(seq, p, dma_desc_fs_enable); | ||
743 | print_param(seq, p, speed); | ||
744 | print_param(seq, p, enable_dynamic_fifo); | ||
745 | print_param(seq, p, en_multiple_tx_fifo); | ||
746 | print_param(seq, p, host_rx_fifo_size); | ||
747 | print_param(seq, p, host_nperio_tx_fifo_size); | ||
748 | print_param(seq, p, host_perio_tx_fifo_size); | ||
749 | print_param(seq, p, max_transfer_size); | ||
750 | print_param(seq, p, max_packet_count); | ||
751 | print_param(seq, p, host_channels); | ||
752 | print_param(seq, p, phy_type); | ||
753 | print_param(seq, p, phy_utmi_width); | ||
754 | print_param(seq, p, phy_ulpi_ddr); | ||
755 | print_param(seq, p, phy_ulpi_ext_vbus); | ||
756 | print_param(seq, p, i2c_enable); | ||
757 | print_param(seq, p, ulpi_fs_ls); | ||
758 | print_param(seq, p, host_support_fs_ls_low_power); | ||
759 | print_param(seq, p, host_ls_low_power_phy_clk); | ||
760 | print_param(seq, p, ts_dline); | ||
761 | print_param(seq, p, reload_ctl); | ||
762 | print_param_hex(seq, p, ahbcfg); | ||
763 | print_param(seq, p, uframe_sched); | ||
764 | print_param(seq, p, external_id_pin_ctl); | ||
765 | print_param(seq, p, hibernation); | ||
766 | print_param(seq, p, host_dma); | ||
767 | print_param(seq, p, g_dma); | ||
768 | print_param(seq, p, g_dma_desc); | ||
769 | print_param(seq, p, g_rx_fifo_size); | ||
770 | print_param(seq, p, g_np_tx_fifo_size); | ||
771 | |||
772 | for (i = 0; i < MAX_EPS_CHANNELS; i++) { | ||
773 | char str[32]; | ||
774 | |||
775 | snprintf(str, 32, "g_tx_fifo_size[%d]", i); | ||
776 | seq_printf(seq, "%-30s: %d\n", str, p->g_tx_fifo_size[i]); | ||
777 | } | ||
778 | |||
779 | return 0; | ||
780 | } | ||
781 | |||
782 | static int params_open(struct inode *inode, struct file *file) | ||
783 | { | ||
784 | return single_open(file, params_show, inode->i_private); | ||
785 | } | ||
786 | |||
787 | static const struct file_operations params_fops = { | ||
788 | .owner = THIS_MODULE, | ||
789 | .open = params_open, | ||
790 | .read = seq_read, | ||
791 | .llseek = seq_lseek, | ||
792 | .release = single_release, | ||
793 | }; | ||
794 | |||
795 | static int hw_params_show(struct seq_file *seq, void *v) | ||
796 | { | ||
797 | struct dwc2_hsotg *hsotg = seq->private; | ||
798 | struct dwc2_hw_params *hw = &hsotg->hw_params; | ||
799 | |||
800 | print_param(seq, hw, op_mode); | ||
801 | print_param(seq, hw, arch); | ||
802 | print_param(seq, hw, dma_desc_enable); | ||
803 | print_param(seq, hw, enable_dynamic_fifo); | ||
804 | print_param(seq, hw, en_multiple_tx_fifo); | ||
805 | print_param(seq, hw, rx_fifo_size); | ||
806 | print_param(seq, hw, host_nperio_tx_fifo_size); | ||
807 | print_param(seq, hw, dev_nperio_tx_fifo_size); | ||
808 | print_param(seq, hw, host_perio_tx_fifo_size); | ||
809 | print_param(seq, hw, nperio_tx_q_depth); | ||
810 | print_param(seq, hw, host_perio_tx_q_depth); | ||
811 | print_param(seq, hw, dev_token_q_depth); | ||
812 | print_param(seq, hw, max_transfer_size); | ||
813 | print_param(seq, hw, max_packet_count); | ||
814 | print_param(seq, hw, host_channels); | ||
815 | print_param(seq, hw, hs_phy_type); | ||
816 | print_param(seq, hw, fs_phy_type); | ||
817 | print_param(seq, hw, i2c_enable); | ||
818 | print_param(seq, hw, num_dev_ep); | ||
819 | print_param(seq, hw, num_dev_perio_in_ep); | ||
820 | print_param(seq, hw, total_fifo_size); | ||
821 | print_param(seq, hw, power_optimized); | ||
822 | print_param(seq, hw, utmi_phy_data_width); | ||
823 | print_param_hex(seq, hw, snpsid); | ||
824 | print_param_hex(seq, hw, dev_ep_dirs); | ||
825 | |||
826 | return 0; | ||
827 | } | ||
828 | |||
829 | static int hw_params_open(struct inode *inode, struct file *file) | ||
830 | { | ||
831 | return single_open(file, hw_params_show, inode->i_private); | ||
832 | } | ||
833 | |||
834 | static const struct file_operations hw_params_fops = { | ||
835 | .owner = THIS_MODULE, | ||
836 | .open = hw_params_open, | ||
837 | .read = seq_read, | ||
838 | .llseek = seq_lseek, | ||
839 | .release = single_release, | ||
840 | }; | ||
841 | |||
842 | static int dr_mode_show(struct seq_file *seq, void *v) | ||
843 | { | ||
844 | struct dwc2_hsotg *hsotg = seq->private; | ||
845 | const char *dr_mode = ""; | ||
846 | |||
847 | device_property_read_string(hsotg->dev, "dr_mode", &dr_mode); | ||
848 | seq_printf(seq, "%s\n", dr_mode); | ||
849 | return 0; | ||
850 | } | ||
851 | |||
852 | static int dr_mode_open(struct inode *inode, struct file *file) | ||
853 | { | ||
854 | return single_open(file, dr_mode_show, inode->i_private); | ||
855 | } | ||
856 | |||
857 | static const struct file_operations dr_mode_fops = { | ||
858 | .owner = THIS_MODULE, | ||
859 | .open = dr_mode_open, | ||
860 | .read = seq_read, | ||
861 | .llseek = seq_lseek, | ||
862 | .release = single_release, | ||
863 | }; | ||
864 | |||
728 | int dwc2_debugfs_init(struct dwc2_hsotg *hsotg) | 865 | int dwc2_debugfs_init(struct dwc2_hsotg *hsotg) |
729 | { | 866 | { |
730 | int ret; | 867 | int ret; |
@@ -736,6 +873,25 @@ int dwc2_debugfs_init(struct dwc2_hsotg *hsotg) | |||
736 | goto err0; | 873 | goto err0; |
737 | } | 874 | } |
738 | 875 | ||
876 | file = debugfs_create_file("params", 0444, | ||
877 | hsotg->debug_root, | ||
878 | hsotg, ¶ms_fops); | ||
879 | if (IS_ERR(file)) | ||
880 | dev_err(hsotg->dev, "%s: failed to create params\n", __func__); | ||
881 | |||
882 | file = debugfs_create_file("hw_params", 0444, | ||
883 | hsotg->debug_root, | ||
884 | hsotg, &hw_params_fops); | ||
885 | if (IS_ERR(file)) | ||
886 | dev_err(hsotg->dev, "%s: failed to create hw_params\n", | ||
887 | __func__); | ||
888 | |||
889 | file = debugfs_create_file("dr_mode", 0444, | ||
890 | hsotg->debug_root, | ||
891 | hsotg, &dr_mode_fops); | ||
892 | if (IS_ERR(file)) | ||
893 | dev_err(hsotg->dev, "%s: failed to create dr_mode\n", __func__); | ||
894 | |||
739 | /* Add gadget debugfs nodes */ | 895 | /* Add gadget debugfs nodes */ |
740 | dwc2_hsotg_create_debug(hsotg); | 896 | dwc2_hsotg_create_debug(hsotg); |
741 | 897 | ||
@@ -750,8 +906,8 @@ int dwc2_debugfs_init(struct dwc2_hsotg *hsotg) | |||
750 | hsotg->regset->nregs = ARRAY_SIZE(dwc2_regs); | 906 | hsotg->regset->nregs = ARRAY_SIZE(dwc2_regs); |
751 | hsotg->regset->base = hsotg->regs; | 907 | hsotg->regset->base = hsotg->regs; |
752 | 908 | ||
753 | file = debugfs_create_regset32("regdump", S_IRUGO, hsotg->debug_root, | 909 | file = debugfs_create_regset32("regdump", 0444, hsotg->debug_root, |
754 | hsotg->regset); | 910 | hsotg->regset); |
755 | if (!file) { | 911 | if (!file) { |
756 | ret = -ENOMEM; | 912 | ret = -ENOMEM; |
757 | goto err1; | 913 | goto err1; |