video: fbdev: controlfb: remove function prototypes part #2
Reorder code a bit and then remove no longer needed function prototypes. Acked-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200324134508.25120-6-b.zolnierkie@samsung.com
This commit is contained in:
parent
946e8fd4fb
commit
a57eb14ebb
|
@ -143,20 +143,12 @@ struct fb_info_control {
|
||||||
|
|
||||||
/******************** Prototypes for internal functions **********************/
|
/******************** Prototypes for internal functions **********************/
|
||||||
|
|
||||||
static void set_control_clock(unsigned char *params);
|
|
||||||
static int init_control(struct fb_info_control *p);
|
|
||||||
static void control_set_hardware(struct fb_info_control *p,
|
static void control_set_hardware(struct fb_info_control *p,
|
||||||
struct fb_par_control *par);
|
struct fb_par_control *par);
|
||||||
static int control_of_init(struct device_node *dp);
|
|
||||||
static void find_vram_size(struct fb_info_control *p);
|
|
||||||
static int read_control_sense(struct fb_info_control *p);
|
|
||||||
static int calc_clock_params(unsigned long clk, unsigned char *param);
|
|
||||||
static int control_var_to_par(struct fb_var_screeninfo *var,
|
static int control_var_to_par(struct fb_var_screeninfo *var,
|
||||||
struct fb_par_control *par, const struct fb_info *fb_info);
|
struct fb_par_control *par, const struct fb_info *fb_info);
|
||||||
static void control_par_to_var(struct fb_par_control *par,
|
static void control_par_to_var(struct fb_par_control *par,
|
||||||
struct fb_var_screeninfo *var);
|
struct fb_var_screeninfo *var);
|
||||||
static void control_init_info(struct fb_info *info, struct fb_info_control *p);
|
|
||||||
static void control_cleanup(void);
|
|
||||||
|
|
||||||
|
|
||||||
/************************** Internal variables *******************************/
|
/************************** Internal variables *******************************/
|
||||||
|
@ -370,77 +362,6 @@ static void set_control_clock(unsigned char *params)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* finish off the driver initialization and register
|
|
||||||
*/
|
|
||||||
static int __init init_control(struct fb_info_control *p)
|
|
||||||
{
|
|
||||||
int full, sense, vmode, cmode, vyres;
|
|
||||||
struct fb_var_screeninfo var;
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
printk(KERN_INFO "controlfb: ");
|
|
||||||
|
|
||||||
full = p->total_vram == 0x400000;
|
|
||||||
|
|
||||||
/* Try to pick a video mode out of NVRAM if we have one. */
|
|
||||||
cmode = default_cmode;
|
|
||||||
if (IS_REACHABLE(CONFIG_NVRAM) && cmode == CMODE_NVRAM)
|
|
||||||
cmode = nvram_read_byte(NV_CMODE);
|
|
||||||
if (cmode < CMODE_8 || cmode > CMODE_32)
|
|
||||||
cmode = CMODE_8;
|
|
||||||
|
|
||||||
vmode = default_vmode;
|
|
||||||
if (IS_REACHABLE(CONFIG_NVRAM) && vmode == VMODE_NVRAM)
|
|
||||||
vmode = nvram_read_byte(NV_VMODE);
|
|
||||||
if (vmode < 1 || vmode > VMODE_MAX ||
|
|
||||||
control_mac_modes[vmode - 1].m[full] < cmode) {
|
|
||||||
sense = read_control_sense(p);
|
|
||||||
printk(KERN_CONT "Monitor sense value = 0x%x, ", sense);
|
|
||||||
vmode = mac_map_monitor_sense(sense);
|
|
||||||
if (control_mac_modes[vmode - 1].m[full] < 0)
|
|
||||||
vmode = VMODE_640_480_60;
|
|
||||||
cmode = min(cmode, control_mac_modes[vmode - 1].m[full]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize info structure */
|
|
||||||
control_init_info(&p->info, p);
|
|
||||||
|
|
||||||
/* Setup default var */
|
|
||||||
if (mac_vmode_to_var(vmode, cmode, &var) < 0) {
|
|
||||||
/* This shouldn't happen! */
|
|
||||||
printk("mac_vmode_to_var(%d, %d,) failed\n", vmode, cmode);
|
|
||||||
try_again:
|
|
||||||
vmode = VMODE_640_480_60;
|
|
||||||
cmode = CMODE_8;
|
|
||||||
if (mac_vmode_to_var(vmode, cmode, &var) < 0) {
|
|
||||||
printk(KERN_ERR "controlfb: mac_vmode_to_var() failed\n");
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
printk(KERN_INFO "controlfb: ");
|
|
||||||
}
|
|
||||||
printk("using video mode %d and color mode %d.\n", vmode, cmode);
|
|
||||||
|
|
||||||
vyres = (p->total_vram - CTRLFB_OFF) / (var.xres << cmode);
|
|
||||||
if (vyres > var.yres)
|
|
||||||
var.yres_virtual = vyres;
|
|
||||||
|
|
||||||
/* Apply default var */
|
|
||||||
var.activate = FB_ACTIVATE_NOW;
|
|
||||||
rc = fb_set_var(&p->info, &var);
|
|
||||||
if (rc && (vmode != VMODE_640_480_60 || cmode != CMODE_8))
|
|
||||||
goto try_again;
|
|
||||||
|
|
||||||
/* Register with fbdev layer */
|
|
||||||
if (register_framebuffer(&p->info) < 0)
|
|
||||||
return -ENXIO;
|
|
||||||
|
|
||||||
fb_info(&p->info, "control display adapter\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define RADACAL_WRITE(a,d) \
|
#define RADACAL_WRITE(a,d) \
|
||||||
out_8(&p->cmap_regs->addr, (a)); \
|
out_8(&p->cmap_regs->addr, (a)); \
|
||||||
out_8(&p->cmap_regs->dat, (d))
|
out_8(&p->cmap_regs->dat, (d))
|
||||||
|
@ -502,67 +423,6 @@ static void control_set_hardware(struct fb_info_control *p, struct fb_par_contro
|
||||||
#endif /* CONFIG_BOOTX_TEXT */
|
#endif /* CONFIG_BOOTX_TEXT */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Parse user specified options (`video=controlfb:')
|
|
||||||
*/
|
|
||||||
static void __init control_setup(char *options)
|
|
||||||
{
|
|
||||||
char *this_opt;
|
|
||||||
|
|
||||||
if (!options || !*options)
|
|
||||||
return;
|
|
||||||
|
|
||||||
while ((this_opt = strsep(&options, ",")) != NULL) {
|
|
||||||
if (!strncmp(this_opt, "vmode:", 6)) {
|
|
||||||
int vmode = simple_strtoul(this_opt+6, NULL, 0);
|
|
||||||
if (vmode > 0 && vmode <= VMODE_MAX &&
|
|
||||||
control_mac_modes[vmode - 1].m[1] >= 0)
|
|
||||||
default_vmode = vmode;
|
|
||||||
} else if (!strncmp(this_opt, "cmode:", 6)) {
|
|
||||||
int depth = simple_strtoul(this_opt+6, NULL, 0);
|
|
||||||
switch (depth) {
|
|
||||||
case CMODE_8:
|
|
||||||
case CMODE_16:
|
|
||||||
case CMODE_32:
|
|
||||||
default_cmode = depth;
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
default_cmode = CMODE_8;
|
|
||||||
break;
|
|
||||||
case 15:
|
|
||||||
case 16:
|
|
||||||
default_cmode = CMODE_16;
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
case 32:
|
|
||||||
default_cmode = CMODE_32;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __init control_init(void)
|
|
||||||
{
|
|
||||||
struct device_node *dp;
|
|
||||||
char *option = NULL;
|
|
||||||
int ret = -ENXIO;
|
|
||||||
|
|
||||||
if (fb_get_options("controlfb", &option))
|
|
||||||
return -ENODEV;
|
|
||||||
control_setup(option);
|
|
||||||
|
|
||||||
dp = of_find_node_by_name(NULL, "control");
|
|
||||||
if (dp && !control_of_init(dp))
|
|
||||||
ret = 0;
|
|
||||||
of_node_put(dp);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
device_initcall(control_init);
|
|
||||||
|
|
||||||
/* Work out which banks of VRAM we have installed. */
|
/* Work out which banks of VRAM we have installed. */
|
||||||
/* danj: I guess the card just ignores writes to nonexistant VRAM... */
|
/* danj: I guess the card just ignores writes to nonexistant VRAM... */
|
||||||
|
|
||||||
|
@ -627,78 +487,6 @@ static void __init find_vram_size(struct fb_info_control *p)
|
||||||
(bank1 + bank2) << 1, bank1 << 1, bank2 << 1);
|
(bank1 + bank2) << 1, bank1 << 1, bank2 << 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* find "control" and initialize
|
|
||||||
*/
|
|
||||||
static int __init control_of_init(struct device_node *dp)
|
|
||||||
{
|
|
||||||
struct fb_info_control *p;
|
|
||||||
struct resource fb_res, reg_res;
|
|
||||||
|
|
||||||
if (control_fb) {
|
|
||||||
printk(KERN_ERR "controlfb: only one control is supported\n");
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (of_pci_address_to_resource(dp, 2, &fb_res) ||
|
|
||||||
of_pci_address_to_resource(dp, 1, ®_res)) {
|
|
||||||
printk(KERN_ERR "can't get 2 addresses for control\n");
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
p = kzalloc(sizeof(*p), GFP_KERNEL);
|
|
||||||
if (!p)
|
|
||||||
return -ENOMEM;
|
|
||||||
control_fb = p; /* save it for cleanups */
|
|
||||||
|
|
||||||
/* Map in frame buffer and registers */
|
|
||||||
p->fb_orig_base = fb_res.start;
|
|
||||||
p->fb_orig_size = resource_size(&fb_res);
|
|
||||||
/* use the big-endian aperture (??) */
|
|
||||||
p->frame_buffer_phys = fb_res.start + 0x800000;
|
|
||||||
p->control_regs_phys = reg_res.start;
|
|
||||||
p->control_regs_size = resource_size(®_res);
|
|
||||||
|
|
||||||
if (!p->fb_orig_base ||
|
|
||||||
!request_mem_region(p->fb_orig_base,p->fb_orig_size,"controlfb")) {
|
|
||||||
p->fb_orig_base = 0;
|
|
||||||
goto error_out;
|
|
||||||
}
|
|
||||||
/* map at most 8MB for the frame buffer */
|
|
||||||
p->frame_buffer = ioremap_wt(p->frame_buffer_phys, 0x800000);
|
|
||||||
|
|
||||||
if (!p->control_regs_phys ||
|
|
||||||
!request_mem_region(p->control_regs_phys, p->control_regs_size,
|
|
||||||
"controlfb regs")) {
|
|
||||||
p->control_regs_phys = 0;
|
|
||||||
goto error_out;
|
|
||||||
}
|
|
||||||
p->control_regs = ioremap(p->control_regs_phys, p->control_regs_size);
|
|
||||||
|
|
||||||
p->cmap_regs_phys = 0xf301b000; /* XXX not in prom? */
|
|
||||||
if (!request_mem_region(p->cmap_regs_phys, 0x1000, "controlfb cmap")) {
|
|
||||||
p->cmap_regs_phys = 0;
|
|
||||||
goto error_out;
|
|
||||||
}
|
|
||||||
p->cmap_regs = ioremap(p->cmap_regs_phys, 0x1000);
|
|
||||||
|
|
||||||
if (!p->cmap_regs || !p->control_regs || !p->frame_buffer)
|
|
||||||
goto error_out;
|
|
||||||
|
|
||||||
find_vram_size(p);
|
|
||||||
if (!p->total_vram)
|
|
||||||
goto error_out;
|
|
||||||
|
|
||||||
if (init_control(p) < 0)
|
|
||||||
goto error_out;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error_out:
|
|
||||||
control_cleanup();
|
|
||||||
return -ENXIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the monitor sense value.
|
* Get the monitor sense value.
|
||||||
* Note that this can be called before calibrate_delay,
|
* Note that this can be called before calibrate_delay,
|
||||||
|
@ -1022,6 +810,115 @@ static void __init control_init_info(struct fb_info *info, struct fb_info_contro
|
||||||
info->fix.accel = FB_ACCEL_NONE;
|
info->fix.accel = FB_ACCEL_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse user specified options (`video=controlfb:')
|
||||||
|
*/
|
||||||
|
static void __init control_setup(char *options)
|
||||||
|
{
|
||||||
|
char *this_opt;
|
||||||
|
|
||||||
|
if (!options || !*options)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while ((this_opt = strsep(&options, ",")) != NULL) {
|
||||||
|
if (!strncmp(this_opt, "vmode:", 6)) {
|
||||||
|
int vmode = simple_strtoul(this_opt+6, NULL, 0);
|
||||||
|
if (vmode > 0 && vmode <= VMODE_MAX &&
|
||||||
|
control_mac_modes[vmode - 1].m[1] >= 0)
|
||||||
|
default_vmode = vmode;
|
||||||
|
} else if (!strncmp(this_opt, "cmode:", 6)) {
|
||||||
|
int depth = simple_strtoul(this_opt+6, NULL, 0);
|
||||||
|
switch (depth) {
|
||||||
|
case CMODE_8:
|
||||||
|
case CMODE_16:
|
||||||
|
case CMODE_32:
|
||||||
|
default_cmode = depth;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
default_cmode = CMODE_8;
|
||||||
|
break;
|
||||||
|
case 15:
|
||||||
|
case 16:
|
||||||
|
default_cmode = CMODE_16;
|
||||||
|
break;
|
||||||
|
case 24:
|
||||||
|
case 32:
|
||||||
|
default_cmode = CMODE_32;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* finish off the driver initialization and register
|
||||||
|
*/
|
||||||
|
static int __init init_control(struct fb_info_control *p)
|
||||||
|
{
|
||||||
|
int full, sense, vmode, cmode, vyres;
|
||||||
|
struct fb_var_screeninfo var;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
printk(KERN_INFO "controlfb: ");
|
||||||
|
|
||||||
|
full = p->total_vram == 0x400000;
|
||||||
|
|
||||||
|
/* Try to pick a video mode out of NVRAM if we have one. */
|
||||||
|
cmode = default_cmode;
|
||||||
|
if (IS_REACHABLE(CONFIG_NVRAM) && cmode == CMODE_NVRAM)
|
||||||
|
cmode = nvram_read_byte(NV_CMODE);
|
||||||
|
if (cmode < CMODE_8 || cmode > CMODE_32)
|
||||||
|
cmode = CMODE_8;
|
||||||
|
|
||||||
|
vmode = default_vmode;
|
||||||
|
if (IS_REACHABLE(CONFIG_NVRAM) && vmode == VMODE_NVRAM)
|
||||||
|
vmode = nvram_read_byte(NV_VMODE);
|
||||||
|
if (vmode < 1 || vmode > VMODE_MAX ||
|
||||||
|
control_mac_modes[vmode - 1].m[full] < cmode) {
|
||||||
|
sense = read_control_sense(p);
|
||||||
|
printk(KERN_CONT "Monitor sense value = 0x%x, ", sense);
|
||||||
|
vmode = mac_map_monitor_sense(sense);
|
||||||
|
if (control_mac_modes[vmode - 1].m[full] < 0)
|
||||||
|
vmode = VMODE_640_480_60;
|
||||||
|
cmode = min(cmode, control_mac_modes[vmode - 1].m[full]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize info structure */
|
||||||
|
control_init_info(&p->info, p);
|
||||||
|
|
||||||
|
/* Setup default var */
|
||||||
|
if (mac_vmode_to_var(vmode, cmode, &var) < 0) {
|
||||||
|
/* This shouldn't happen! */
|
||||||
|
printk("mac_vmode_to_var(%d, %d,) failed\n", vmode, cmode);
|
||||||
|
try_again:
|
||||||
|
vmode = VMODE_640_480_60;
|
||||||
|
cmode = CMODE_8;
|
||||||
|
if (mac_vmode_to_var(vmode, cmode, &var) < 0) {
|
||||||
|
printk(KERN_ERR "controlfb: mac_vmode_to_var() failed\n");
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
printk(KERN_INFO "controlfb: ");
|
||||||
|
}
|
||||||
|
printk("using video mode %d and color mode %d.\n", vmode, cmode);
|
||||||
|
|
||||||
|
vyres = (p->total_vram - CTRLFB_OFF) / (var.xres << cmode);
|
||||||
|
if (vyres > var.yres)
|
||||||
|
var.yres_virtual = vyres;
|
||||||
|
|
||||||
|
/* Apply default var */
|
||||||
|
var.activate = FB_ACTIVATE_NOW;
|
||||||
|
rc = fb_set_var(&p->info, &var);
|
||||||
|
if (rc && (vmode != VMODE_640_480_60 || cmode != CMODE_8))
|
||||||
|
goto try_again;
|
||||||
|
|
||||||
|
/* Register with fbdev layer */
|
||||||
|
if (register_framebuffer(&p->info) < 0)
|
||||||
|
return -ENXIO;
|
||||||
|
|
||||||
|
fb_info(&p->info, "control display adapter\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void control_cleanup(void)
|
static void control_cleanup(void)
|
||||||
{
|
{
|
||||||
|
@ -1048,4 +945,93 @@ static void control_cleanup(void)
|
||||||
kfree(p);
|
kfree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* find "control" and initialize
|
||||||
|
*/
|
||||||
|
static int __init control_of_init(struct device_node *dp)
|
||||||
|
{
|
||||||
|
struct fb_info_control *p;
|
||||||
|
struct resource fb_res, reg_res;
|
||||||
|
|
||||||
|
if (control_fb) {
|
||||||
|
printk(KERN_ERR "controlfb: only one control is supported\n");
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (of_pci_address_to_resource(dp, 2, &fb_res) ||
|
||||||
|
of_pci_address_to_resource(dp, 1, ®_res)) {
|
||||||
|
printk(KERN_ERR "can't get 2 addresses for control\n");
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
p = kzalloc(sizeof(*p), GFP_KERNEL);
|
||||||
|
if (!p)
|
||||||
|
return -ENOMEM;
|
||||||
|
control_fb = p; /* save it for cleanups */
|
||||||
|
|
||||||
|
/* Map in frame buffer and registers */
|
||||||
|
p->fb_orig_base = fb_res.start;
|
||||||
|
p->fb_orig_size = resource_size(&fb_res);
|
||||||
|
/* use the big-endian aperture (??) */
|
||||||
|
p->frame_buffer_phys = fb_res.start + 0x800000;
|
||||||
|
p->control_regs_phys = reg_res.start;
|
||||||
|
p->control_regs_size = resource_size(®_res);
|
||||||
|
|
||||||
|
if (!p->fb_orig_base ||
|
||||||
|
!request_mem_region(p->fb_orig_base,p->fb_orig_size,"controlfb")) {
|
||||||
|
p->fb_orig_base = 0;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
/* map at most 8MB for the frame buffer */
|
||||||
|
p->frame_buffer = ioremap_wt(p->frame_buffer_phys, 0x800000);
|
||||||
|
|
||||||
|
if (!p->control_regs_phys ||
|
||||||
|
!request_mem_region(p->control_regs_phys, p->control_regs_size,
|
||||||
|
"controlfb regs")) {
|
||||||
|
p->control_regs_phys = 0;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
p->control_regs = ioremap(p->control_regs_phys, p->control_regs_size);
|
||||||
|
|
||||||
|
p->cmap_regs_phys = 0xf301b000; /* XXX not in prom? */
|
||||||
|
if (!request_mem_region(p->cmap_regs_phys, 0x1000, "controlfb cmap")) {
|
||||||
|
p->cmap_regs_phys = 0;
|
||||||
|
goto error_out;
|
||||||
|
}
|
||||||
|
p->cmap_regs = ioremap(p->cmap_regs_phys, 0x1000);
|
||||||
|
|
||||||
|
if (!p->cmap_regs || !p->control_regs || !p->frame_buffer)
|
||||||
|
goto error_out;
|
||||||
|
|
||||||
|
find_vram_size(p);
|
||||||
|
if (!p->total_vram)
|
||||||
|
goto error_out;
|
||||||
|
|
||||||
|
if (init_control(p) < 0)
|
||||||
|
goto error_out;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error_out:
|
||||||
|
control_cleanup();
|
||||||
|
return -ENXIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init control_init(void)
|
||||||
|
{
|
||||||
|
struct device_node *dp;
|
||||||
|
char *option = NULL;
|
||||||
|
int ret = -ENXIO;
|
||||||
|
|
||||||
|
if (fb_get_options("controlfb", &option))
|
||||||
|
return -ENODEV;
|
||||||
|
control_setup(option);
|
||||||
|
|
||||||
|
dp = of_find_node_by_name(NULL, "control");
|
||||||
|
if (dp && !control_of_init(dp))
|
||||||
|
ret = 0;
|
||||||
|
of_node_put(dp);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
device_initcall(control_init);
|
||||||
|
|
Loading…
Reference in New Issue