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