mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
00977a59b9
Many struct file_operations in the kernel can be "const". Marking them const moves these to the .rodata section, which avoids false sharing with potential dirty data. In addition it'll catch accidental writes at compile time to these shared resources. Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
245 lines
8.0 KiB
C
245 lines
8.0 KiB
C
#include <linux/debugfs.h>
|
|
|
|
#define BIG_BUFFER_SIZE (1024)
|
|
|
|
static char big_buffer[BIG_BUFFER_SIZE];
|
|
|
|
struct mbxfb_debugfs_data {
|
|
struct dentry *dir;
|
|
struct dentry *sysconf;
|
|
struct dentry *clock;
|
|
struct dentry *display;
|
|
struct dentry *gsctl;
|
|
struct dentry *sdram;
|
|
struct dentry *misc;
|
|
};
|
|
|
|
static int open_file_generic(struct inode *inode, struct file *file)
|
|
{
|
|
file->private_data = inode->u.generic_ip;
|
|
return 0;
|
|
}
|
|
|
|
static ssize_t write_file_dummy(struct file *file, const char __user *buf,
|
|
size_t count, loff_t *ppos)
|
|
{
|
|
return count;
|
|
}
|
|
|
|
static ssize_t sysconf_read_file(struct file *file, char __user *userbuf,
|
|
size_t count, loff_t *ppos)
|
|
{
|
|
char * s = big_buffer;
|
|
|
|
s += sprintf(s, "SYSCFG = %08x\n", readl(SYSCFG));
|
|
s += sprintf(s, "PFBASE = %08x\n", readl(PFBASE));
|
|
s += sprintf(s, "PFCEIL = %08x\n", readl(PFCEIL));
|
|
s += sprintf(s, "POLLFLAG = %08x\n", readl(POLLFLAG));
|
|
s += sprintf(s, "SYSRST = %08x\n", readl(SYSRST));
|
|
|
|
return simple_read_from_buffer(userbuf, count, ppos,
|
|
big_buffer, s-big_buffer);
|
|
}
|
|
|
|
|
|
static ssize_t gsctl_read_file(struct file *file, char __user *userbuf,
|
|
size_t count, loff_t *ppos)
|
|
{
|
|
char * s = big_buffer;
|
|
|
|
s += sprintf(s, "GSCTRL = %08x\n", readl(GSCTRL));
|
|
s += sprintf(s, "VSCTRL = %08x\n", readl(VSCTRL));
|
|
s += sprintf(s, "GBBASE = %08x\n", readl(GBBASE));
|
|
s += sprintf(s, "VBBASE = %08x\n", readl(VBBASE));
|
|
s += sprintf(s, "GDRCTRL = %08x\n", readl(GDRCTRL));
|
|
s += sprintf(s, "VCMSK = %08x\n", readl(VCMSK));
|
|
s += sprintf(s, "GSCADR = %08x\n", readl(GSCADR));
|
|
s += sprintf(s, "VSCADR = %08x\n", readl(VSCADR));
|
|
s += sprintf(s, "VUBASE = %08x\n", readl(VUBASE));
|
|
s += sprintf(s, "VVBASE = %08x\n", readl(VVBASE));
|
|
s += sprintf(s, "GSADR = %08x\n", readl(GSADR));
|
|
s += sprintf(s, "VSADR = %08x\n", readl(VSADR));
|
|
s += sprintf(s, "HCCTRL = %08x\n", readl(HCCTRL));
|
|
s += sprintf(s, "HCSIZE = %08x\n", readl(HCSIZE));
|
|
s += sprintf(s, "HCPOS = %08x\n", readl(HCPOS));
|
|
s += sprintf(s, "HCBADR = %08x\n", readl(HCBADR));
|
|
s += sprintf(s, "HCCKMSK = %08x\n", readl(HCCKMSK));
|
|
s += sprintf(s, "GPLUT = %08x\n", readl(GPLUT));
|
|
|
|
return simple_read_from_buffer(userbuf, count, ppos,
|
|
big_buffer, s-big_buffer);
|
|
}
|
|
|
|
static ssize_t display_read_file(struct file *file, char __user *userbuf,
|
|
size_t count, loff_t *ppos)
|
|
{
|
|
char * s = big_buffer;
|
|
|
|
s += sprintf(s, "DSCTRL = %08x\n", readl(DSCTRL));
|
|
s += sprintf(s, "DHT01 = %08x\n", readl(DHT01));
|
|
s += sprintf(s, "DHT02 = %08x\n", readl(DHT02));
|
|
s += sprintf(s, "DHT03 = %08x\n", readl(DHT03));
|
|
s += sprintf(s, "DVT01 = %08x\n", readl(DVT01));
|
|
s += sprintf(s, "DVT02 = %08x\n", readl(DVT02));
|
|
s += sprintf(s, "DVT03 = %08x\n", readl(DVT03));
|
|
s += sprintf(s, "DBCOL = %08x\n", readl(DBCOL));
|
|
s += sprintf(s, "BGCOLOR = %08x\n", readl(BGCOLOR));
|
|
s += sprintf(s, "DINTRS = %08x\n", readl(DINTRS));
|
|
s += sprintf(s, "DINTRE = %08x\n", readl(DINTRE));
|
|
s += sprintf(s, "DINTRCNT = %08x\n", readl(DINTRCNT));
|
|
s += sprintf(s, "DSIG = %08x\n", readl(DSIG));
|
|
s += sprintf(s, "DMCTRL = %08x\n", readl(DMCTRL));
|
|
s += sprintf(s, "CLIPCTRL = %08x\n", readl(CLIPCTRL));
|
|
s += sprintf(s, "SPOCTRL = %08x\n", readl(SPOCTRL));
|
|
s += sprintf(s, "SVCTRL = %08x\n", readl(SVCTRL));
|
|
s += sprintf(s, "DLSTS = %08x\n", readl(DLSTS));
|
|
s += sprintf(s, "DLLCTRL = %08x\n", readl(DLLCTRL));
|
|
s += sprintf(s, "DVLNUM = %08x\n", readl(DVLNUM));
|
|
s += sprintf(s, "DUCTRL = %08x\n", readl(DUCTRL));
|
|
s += sprintf(s, "DVECTRL = %08x\n", readl(DVECTRL));
|
|
s += sprintf(s, "DHDET = %08x\n", readl(DHDET));
|
|
s += sprintf(s, "DVDET = %08x\n", readl(DVDET));
|
|
s += sprintf(s, "DODMSK = %08x\n", readl(DODMSK));
|
|
s += sprintf(s, "CSC01 = %08x\n", readl(CSC01));
|
|
s += sprintf(s, "CSC02 = %08x\n", readl(CSC02));
|
|
s += sprintf(s, "CSC03 = %08x\n", readl(CSC03));
|
|
s += sprintf(s, "CSC04 = %08x\n", readl(CSC04));
|
|
s += sprintf(s, "CSC05 = %08x\n", readl(CSC05));
|
|
|
|
return simple_read_from_buffer(userbuf, count, ppos,
|
|
big_buffer, s-big_buffer);
|
|
}
|
|
|
|
static ssize_t clock_read_file(struct file *file, char __user *userbuf,
|
|
size_t count, loff_t *ppos)
|
|
{
|
|
char * s = big_buffer;
|
|
|
|
s += sprintf(s, "SYSCLKSRC = %08x\n", readl(SYSCLKSRC));
|
|
s += sprintf(s, "PIXCLKSRC = %08x\n", readl(PIXCLKSRC));
|
|
s += sprintf(s, "CLKSLEEP = %08x\n", readl(CLKSLEEP));
|
|
s += sprintf(s, "COREPLL = %08x\n", readl(COREPLL));
|
|
s += sprintf(s, "DISPPLL = %08x\n", readl(DISPPLL));
|
|
s += sprintf(s, "PLLSTAT = %08x\n", readl(PLLSTAT));
|
|
s += sprintf(s, "VOVRCLK = %08x\n", readl(VOVRCLK));
|
|
s += sprintf(s, "PIXCLK = %08x\n", readl(PIXCLK));
|
|
s += sprintf(s, "MEMCLK = %08x\n", readl(MEMCLK));
|
|
s += sprintf(s, "M24CLK = %08x\n", readl(M24CLK));
|
|
s += sprintf(s, "MBXCLK = %08x\n", readl(MBXCLK));
|
|
s += sprintf(s, "SDCLK = %08x\n", readl(SDCLK));
|
|
s += sprintf(s, "PIXCLKDIV = %08x\n", readl(PIXCLKDIV));
|
|
|
|
return simple_read_from_buffer(userbuf, count, ppos,
|
|
big_buffer, s-big_buffer);
|
|
}
|
|
|
|
static ssize_t sdram_read_file(struct file *file, char __user *userbuf,
|
|
size_t count, loff_t *ppos)
|
|
{
|
|
char * s = big_buffer;
|
|
|
|
s += sprintf(s, "LMRST = %08x\n", readl(LMRST));
|
|
s += sprintf(s, "LMCFG = %08x\n", readl(LMCFG));
|
|
s += sprintf(s, "LMPWR = %08x\n", readl(LMPWR));
|
|
s += sprintf(s, "LMPWRSTAT = %08x\n", readl(LMPWRSTAT));
|
|
s += sprintf(s, "LMCEMR = %08x\n", readl(LMCEMR));
|
|
s += sprintf(s, "LMTYPE = %08x\n", readl(LMTYPE));
|
|
s += sprintf(s, "LMTIM = %08x\n", readl(LMTIM));
|
|
s += sprintf(s, "LMREFRESH = %08x\n", readl(LMREFRESH));
|
|
s += sprintf(s, "LMPROTMIN = %08x\n", readl(LMPROTMIN));
|
|
s += sprintf(s, "LMPROTMAX = %08x\n", readl(LMPROTMAX));
|
|
s += sprintf(s, "LMPROTCFG = %08x\n", readl(LMPROTCFG));
|
|
s += sprintf(s, "LMPROTERR = %08x\n", readl(LMPROTERR));
|
|
|
|
return simple_read_from_buffer(userbuf, count, ppos,
|
|
big_buffer, s-big_buffer);
|
|
}
|
|
|
|
static ssize_t misc_read_file(struct file *file, char __user *userbuf,
|
|
size_t count, loff_t *ppos)
|
|
{
|
|
char * s = big_buffer;
|
|
|
|
s += sprintf(s, "LCD_CONFIG = %08x\n", readl(LCD_CONFIG));
|
|
s += sprintf(s, "ODFBPWR = %08x\n", readl(ODFBPWR));
|
|
s += sprintf(s, "ODFBSTAT = %08x\n", readl(ODFBSTAT));
|
|
s += sprintf(s, "ID = %08x\n", readl(ID));
|
|
|
|
return simple_read_from_buffer(userbuf, count, ppos,
|
|
big_buffer, s-big_buffer);
|
|
}
|
|
|
|
|
|
static const struct file_operations sysconf_fops = {
|
|
.read = sysconf_read_file,
|
|
.write = write_file_dummy,
|
|
.open = open_file_generic,
|
|
};
|
|
|
|
static const struct file_operations clock_fops = {
|
|
.read = clock_read_file,
|
|
.write = write_file_dummy,
|
|
.open = open_file_generic,
|
|
};
|
|
|
|
static const struct file_operations display_fops = {
|
|
.read = display_read_file,
|
|
.write = write_file_dummy,
|
|
.open = open_file_generic,
|
|
};
|
|
|
|
static const struct file_operations gsctl_fops = {
|
|
.read = gsctl_read_file,
|
|
.write = write_file_dummy,
|
|
.open = open_file_generic,
|
|
};
|
|
|
|
static const struct file_operations sdram_fops = {
|
|
.read = sdram_read_file,
|
|
.write = write_file_dummy,
|
|
.open = open_file_generic,
|
|
};
|
|
|
|
static const struct file_operations misc_fops = {
|
|
.read = misc_read_file,
|
|
.write = write_file_dummy,
|
|
.open = open_file_generic,
|
|
};
|
|
|
|
static void __devinit mbxfb_debugfs_init(struct fb_info *fbi)
|
|
{
|
|
struct mbxfb_info *mfbi = fbi->par;
|
|
struct mbxfb_debugfs_data *dbg;
|
|
|
|
dbg = kzalloc(sizeof(struct mbxfb_debugfs_data), GFP_KERNEL);
|
|
mfbi->debugfs_data = dbg;
|
|
|
|
dbg->dir = debugfs_create_dir("mbxfb", NULL);
|
|
dbg->sysconf = debugfs_create_file("sysconf", 0444, dbg->dir,
|
|
fbi, &sysconf_fops);
|
|
dbg->clock = debugfs_create_file("clock", 0444, dbg->dir,
|
|
fbi, &clock_fops);
|
|
dbg->display = debugfs_create_file("display", 0444, dbg->dir,
|
|
fbi, &display_fops);
|
|
dbg->gsctl = debugfs_create_file("gsctl", 0444, dbg->dir,
|
|
fbi, &gsctl_fops);
|
|
dbg->sdram = debugfs_create_file("sdram", 0444, dbg->dir,
|
|
fbi, &sdram_fops);
|
|
dbg->misc = debugfs_create_file("misc", 0444, dbg->dir,
|
|
fbi, &misc_fops);
|
|
}
|
|
|
|
static void __devexit mbxfb_debugfs_remove(struct fb_info *fbi)
|
|
{
|
|
struct mbxfb_info *mfbi = fbi->par;
|
|
struct mbxfb_debugfs_data *dbg = mfbi->debugfs_data;
|
|
|
|
debugfs_remove(dbg->misc);
|
|
debugfs_remove(dbg->sdram);
|
|
debugfs_remove(dbg->gsctl);
|
|
debugfs_remove(dbg->display);
|
|
debugfs_remove(dbg->clock);
|
|
debugfs_remove(dbg->sysconf);
|
|
debugfs_remove(dbg->dir);
|
|
}
|