at v5.3 232 lines 7.8 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2#include <linux/debugfs.h> 3#include <linux/slab.h> 4 5#define BIG_BUFFER_SIZE (1024) 6 7static char big_buffer[BIG_BUFFER_SIZE]; 8 9struct mbxfb_debugfs_data { 10 struct dentry *dir; 11 struct dentry *sysconf; 12 struct dentry *clock; 13 struct dentry *display; 14 struct dentry *gsctl; 15 struct dentry *sdram; 16 struct dentry *misc; 17}; 18 19static ssize_t write_file_dummy(struct file *file, const char __user *buf, 20 size_t count, loff_t *ppos) 21{ 22 return count; 23} 24 25static ssize_t sysconf_read_file(struct file *file, char __user *userbuf, 26 size_t count, loff_t *ppos) 27{ 28 char * s = big_buffer; 29 30 s += sprintf(s, "SYSCFG = %08x\n", readl(SYSCFG)); 31 s += sprintf(s, "PFBASE = %08x\n", readl(PFBASE)); 32 s += sprintf(s, "PFCEIL = %08x\n", readl(PFCEIL)); 33 s += sprintf(s, "POLLFLAG = %08x\n", readl(POLLFLAG)); 34 s += sprintf(s, "SYSRST = %08x\n", readl(SYSRST)); 35 36 return simple_read_from_buffer(userbuf, count, ppos, 37 big_buffer, s-big_buffer); 38} 39 40 41static ssize_t gsctl_read_file(struct file *file, char __user *userbuf, 42 size_t count, loff_t *ppos) 43{ 44 char * s = big_buffer; 45 46 s += sprintf(s, "GSCTRL = %08x\n", readl(GSCTRL)); 47 s += sprintf(s, "VSCTRL = %08x\n", readl(VSCTRL)); 48 s += sprintf(s, "GBBASE = %08x\n", readl(GBBASE)); 49 s += sprintf(s, "VBBASE = %08x\n", readl(VBBASE)); 50 s += sprintf(s, "GDRCTRL = %08x\n", readl(GDRCTRL)); 51 s += sprintf(s, "VCMSK = %08x\n", readl(VCMSK)); 52 s += sprintf(s, "GSCADR = %08x\n", readl(GSCADR)); 53 s += sprintf(s, "VSCADR = %08x\n", readl(VSCADR)); 54 s += sprintf(s, "VUBASE = %08x\n", readl(VUBASE)); 55 s += sprintf(s, "VVBASE = %08x\n", readl(VVBASE)); 56 s += sprintf(s, "GSADR = %08x\n", readl(GSADR)); 57 s += sprintf(s, "VSADR = %08x\n", readl(VSADR)); 58 s += sprintf(s, "HCCTRL = %08x\n", readl(HCCTRL)); 59 s += sprintf(s, "HCSIZE = %08x\n", readl(HCSIZE)); 60 s += sprintf(s, "HCPOS = %08x\n", readl(HCPOS)); 61 s += sprintf(s, "HCBADR = %08x\n", readl(HCBADR)); 62 s += sprintf(s, "HCCKMSK = %08x\n", readl(HCCKMSK)); 63 s += sprintf(s, "GPLUT = %08x\n", readl(GPLUT)); 64 65 return simple_read_from_buffer(userbuf, count, ppos, 66 big_buffer, s-big_buffer); 67} 68 69static ssize_t display_read_file(struct file *file, char __user *userbuf, 70 size_t count, loff_t *ppos) 71{ 72 char * s = big_buffer; 73 74 s += sprintf(s, "DSCTRL = %08x\n", readl(DSCTRL)); 75 s += sprintf(s, "DHT01 = %08x\n", readl(DHT01)); 76 s += sprintf(s, "DHT02 = %08x\n", readl(DHT02)); 77 s += sprintf(s, "DHT03 = %08x\n", readl(DHT03)); 78 s += sprintf(s, "DVT01 = %08x\n", readl(DVT01)); 79 s += sprintf(s, "DVT02 = %08x\n", readl(DVT02)); 80 s += sprintf(s, "DVT03 = %08x\n", readl(DVT03)); 81 s += sprintf(s, "DBCOL = %08x\n", readl(DBCOL)); 82 s += sprintf(s, "BGCOLOR = %08x\n", readl(BGCOLOR)); 83 s += sprintf(s, "DINTRS = %08x\n", readl(DINTRS)); 84 s += sprintf(s, "DINTRE = %08x\n", readl(DINTRE)); 85 s += sprintf(s, "DINTRCNT = %08x\n", readl(DINTRCNT)); 86 s += sprintf(s, "DSIG = %08x\n", readl(DSIG)); 87 s += sprintf(s, "DMCTRL = %08x\n", readl(DMCTRL)); 88 s += sprintf(s, "CLIPCTRL = %08x\n", readl(CLIPCTRL)); 89 s += sprintf(s, "SPOCTRL = %08x\n", readl(SPOCTRL)); 90 s += sprintf(s, "SVCTRL = %08x\n", readl(SVCTRL)); 91 s += sprintf(s, "DLSTS = %08x\n", readl(DLSTS)); 92 s += sprintf(s, "DLLCTRL = %08x\n", readl(DLLCTRL)); 93 s += sprintf(s, "DVLNUM = %08x\n", readl(DVLNUM)); 94 s += sprintf(s, "DUCTRL = %08x\n", readl(DUCTRL)); 95 s += sprintf(s, "DVECTRL = %08x\n", readl(DVECTRL)); 96 s += sprintf(s, "DHDET = %08x\n", readl(DHDET)); 97 s += sprintf(s, "DVDET = %08x\n", readl(DVDET)); 98 s += sprintf(s, "DODMSK = %08x\n", readl(DODMSK)); 99 s += sprintf(s, "CSC01 = %08x\n", readl(CSC01)); 100 s += sprintf(s, "CSC02 = %08x\n", readl(CSC02)); 101 s += sprintf(s, "CSC03 = %08x\n", readl(CSC03)); 102 s += sprintf(s, "CSC04 = %08x\n", readl(CSC04)); 103 s += sprintf(s, "CSC05 = %08x\n", readl(CSC05)); 104 105 return simple_read_from_buffer(userbuf, count, ppos, 106 big_buffer, s-big_buffer); 107} 108 109static ssize_t clock_read_file(struct file *file, char __user *userbuf, 110 size_t count, loff_t *ppos) 111{ 112 char * s = big_buffer; 113 114 s += sprintf(s, "SYSCLKSRC = %08x\n", readl(SYSCLKSRC)); 115 s += sprintf(s, "PIXCLKSRC = %08x\n", readl(PIXCLKSRC)); 116 s += sprintf(s, "CLKSLEEP = %08x\n", readl(CLKSLEEP)); 117 s += sprintf(s, "COREPLL = %08x\n", readl(COREPLL)); 118 s += sprintf(s, "DISPPLL = %08x\n", readl(DISPPLL)); 119 s += sprintf(s, "PLLSTAT = %08x\n", readl(PLLSTAT)); 120 s += sprintf(s, "VOVRCLK = %08x\n", readl(VOVRCLK)); 121 s += sprintf(s, "PIXCLK = %08x\n", readl(PIXCLK)); 122 s += sprintf(s, "MEMCLK = %08x\n", readl(MEMCLK)); 123 s += sprintf(s, "M24CLK = %08x\n", readl(M24CLK)); 124 s += sprintf(s, "MBXCLK = %08x\n", readl(MBXCLK)); 125 s += sprintf(s, "SDCLK = %08x\n", readl(SDCLK)); 126 s += sprintf(s, "PIXCLKDIV = %08x\n", readl(PIXCLKDIV)); 127 128 return simple_read_from_buffer(userbuf, count, ppos, 129 big_buffer, s-big_buffer); 130} 131 132static ssize_t sdram_read_file(struct file *file, char __user *userbuf, 133 size_t count, loff_t *ppos) 134{ 135 char * s = big_buffer; 136 137 s += sprintf(s, "LMRST = %08x\n", readl(LMRST)); 138 s += sprintf(s, "LMCFG = %08x\n", readl(LMCFG)); 139 s += sprintf(s, "LMPWR = %08x\n", readl(LMPWR)); 140 s += sprintf(s, "LMPWRSTAT = %08x\n", readl(LMPWRSTAT)); 141 s += sprintf(s, "LMCEMR = %08x\n", readl(LMCEMR)); 142 s += sprintf(s, "LMTYPE = %08x\n", readl(LMTYPE)); 143 s += sprintf(s, "LMTIM = %08x\n", readl(LMTIM)); 144 s += sprintf(s, "LMREFRESH = %08x\n", readl(LMREFRESH)); 145 s += sprintf(s, "LMPROTMIN = %08x\n", readl(LMPROTMIN)); 146 s += sprintf(s, "LMPROTMAX = %08x\n", readl(LMPROTMAX)); 147 s += sprintf(s, "LMPROTCFG = %08x\n", readl(LMPROTCFG)); 148 s += sprintf(s, "LMPROTERR = %08x\n", readl(LMPROTERR)); 149 150 return simple_read_from_buffer(userbuf, count, ppos, 151 big_buffer, s-big_buffer); 152} 153 154static ssize_t misc_read_file(struct file *file, char __user *userbuf, 155 size_t count, loff_t *ppos) 156{ 157 char * s = big_buffer; 158 159 s += sprintf(s, "LCD_CONFIG = %08x\n", readl(LCD_CONFIG)); 160 s += sprintf(s, "ODFBPWR = %08x\n", readl(ODFBPWR)); 161 s += sprintf(s, "ODFBSTAT = %08x\n", readl(ODFBSTAT)); 162 s += sprintf(s, "ID = %08x\n", readl(ID)); 163 164 return simple_read_from_buffer(userbuf, count, ppos, 165 big_buffer, s-big_buffer); 166} 167 168 169static const struct file_operations sysconf_fops = { 170 .read = sysconf_read_file, 171 .write = write_file_dummy, 172 .open = simple_open, 173 .llseek = default_llseek, 174}; 175 176static const struct file_operations clock_fops = { 177 .read = clock_read_file, 178 .write = write_file_dummy, 179 .open = simple_open, 180 .llseek = default_llseek, 181}; 182 183static const struct file_operations display_fops = { 184 .read = display_read_file, 185 .write = write_file_dummy, 186 .open = simple_open, 187 .llseek = default_llseek, 188}; 189 190static const struct file_operations gsctl_fops = { 191 .read = gsctl_read_file, 192 .write = write_file_dummy, 193 .open = simple_open, 194 .llseek = default_llseek, 195}; 196 197static const struct file_operations sdram_fops = { 198 .read = sdram_read_file, 199 .write = write_file_dummy, 200 .open = simple_open, 201 .llseek = default_llseek, 202}; 203 204static const struct file_operations misc_fops = { 205 .read = misc_read_file, 206 .write = write_file_dummy, 207 .open = simple_open, 208 .llseek = default_llseek, 209}; 210 211static void mbxfb_debugfs_init(struct fb_info *fbi) 212{ 213 struct mbxfb_info *mfbi = fbi->par; 214 struct dentry *dir; 215 216 dir = debugfs_create_dir("mbxfb", NULL); 217 mfbi->debugfs_dir = dir; 218 219 debugfs_create_file("sysconf", 0444, dir, fbi, &sysconf_fops); 220 debugfs_create_file("clock", 0444, dir, fbi, &clock_fops); 221 debugfs_create_file("display", 0444, dir, fbi, &display_fops); 222 debugfs_create_file("gsctl", 0444, dir, fbi, &gsctl_fops); 223 debugfs_create_file("sdram", 0444, dir, fbi, &sdram_fops); 224 debugfs_create_file("misc", 0444, dir, fbi, &misc_fops); 225} 226 227static void mbxfb_debugfs_remove(struct fb_info *fbi) 228{ 229 struct mbxfb_info *mfbi = fbi->par; 230 231 debugfs_remove_recursive(mfbi->debugfs_dir); 232}