提交 7653aaab 编写于 作者: T Timur Tabi 提交者: Paul Mundt

drivers/video: use strings to specify the Freescale DIU monitor port

Instead of using ill-defined numbers (0, 1, and 2) for the monitor port, allow
the user to specify the port by name ("dvi", "lvds", or "dlvds").  This works
on the kernel command line, the module command-line, and the sysfs "monitor"
device.

Note that changing the monitor port does not currently work on the P1022DS,
because the code that talks to the PIXIS FPGA is broken.
Signed-off-by: NTimur Tabi <timur@freescale.com>
Acked-by: NAnatolij Gustschin <agust@denx.de>
Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
上级 c6daf05b
...@@ -66,8 +66,8 @@ struct fsl_diu_shared_fb { ...@@ -66,8 +66,8 @@ struct fsl_diu_shared_fb {
bool in_use; bool in_use;
}; };
unsigned int mpc512x_get_pixel_format(unsigned int bits_per_pixel, u32 mpc512x_get_pixel_format(enum fsl_diu_monitor_port port,
int monitor_port) unsigned int bits_per_pixel)
{ {
switch (bits_per_pixel) { switch (bits_per_pixel) {
case 32: case 32:
...@@ -80,11 +80,12 @@ unsigned int mpc512x_get_pixel_format(unsigned int bits_per_pixel, ...@@ -80,11 +80,12 @@ unsigned int mpc512x_get_pixel_format(unsigned int bits_per_pixel,
return 0x00000400; return 0x00000400;
} }
void mpc512x_set_gamma_table(int monitor_port, char *gamma_table_base) void mpc512x_set_gamma_table(enum fsl_diu_monitor_port port,
char *gamma_table_base)
{ {
} }
void mpc512x_set_monitor_port(int monitor_port) void mpc512x_set_monitor_port(enum fsl_diu_monitor_port port)
{ {
} }
...@@ -182,14 +183,10 @@ void mpc512x_set_pixel_clock(unsigned int pixclock) ...@@ -182,14 +183,10 @@ void mpc512x_set_pixel_clock(unsigned int pixclock)
iounmap(ccm); iounmap(ccm);
} }
ssize_t mpc512x_show_monitor_port(int monitor_port, char *buf) enum fsl_diu_monitor_port
mpc512x_valid_monitor_port(enum fsl_diu_monitor_port port)
{ {
return sprintf(buf, "0 - 5121 LCD\n"); return FSL_DIU_PORT_DVI;
}
int mpc512x_set_sysfs_monitor_port(int val)
{
return 0;
} }
static struct fsl_diu_shared_fb __attribute__ ((__aligned__(8))) diu_shared_fb; static struct fsl_diu_shared_fb __attribute__ ((__aligned__(8))) diu_shared_fb;
...@@ -332,8 +329,7 @@ void __init mpc512x_setup_diu(void) ...@@ -332,8 +329,7 @@ void __init mpc512x_setup_diu(void)
diu_ops.set_gamma_table = mpc512x_set_gamma_table; diu_ops.set_gamma_table = mpc512x_set_gamma_table;
diu_ops.set_monitor_port = mpc512x_set_monitor_port; diu_ops.set_monitor_port = mpc512x_set_monitor_port;
diu_ops.set_pixel_clock = mpc512x_set_pixel_clock; diu_ops.set_pixel_clock = mpc512x_set_pixel_clock;
diu_ops.show_monitor_port = mpc512x_show_monitor_port; diu_ops.valid_monitor_port = mpc512x_valid_monitor_port;
diu_ops.set_sysfs_monitor_port = mpc512x_set_sysfs_monitor_port;
diu_ops.release_bootmem = mpc512x_release_bootmem; diu_ops.release_bootmem = mpc512x_release_bootmem;
#endif #endif
} }
......
...@@ -93,8 +93,8 @@ ...@@ -93,8 +93,8 @@
* The Area Descriptor is a 32-bit value that determine which bits in each * The Area Descriptor is a 32-bit value that determine which bits in each
* pixel are to be used for each color. * pixel are to be used for each color.
*/ */
static unsigned int p1022ds_get_pixel_format(unsigned int bits_per_pixel, static u32 p1022ds_get_pixel_format(enum fsl_diu_monitor_port port,
int monitor_port) unsigned int bits_per_pixel)
{ {
switch (bits_per_pixel) { switch (bits_per_pixel) {
case 32: case 32:
...@@ -118,7 +118,8 @@ static unsigned int p1022ds_get_pixel_format(unsigned int bits_per_pixel, ...@@ -118,7 +118,8 @@ static unsigned int p1022ds_get_pixel_format(unsigned int bits_per_pixel,
* On some boards, the gamma table for some ports may need to be modified. * On some boards, the gamma table for some ports may need to be modified.
* This is not the case on the P1022DS, so we do nothing. * This is not the case on the P1022DS, so we do nothing.
*/ */
static void p1022ds_set_gamma_table(int monitor_port, char *gamma_table_base) static void p1022ds_set_gamma_table(enum fsl_diu_monitor_port port,
char *gamma_table_base)
{ {
} }
...@@ -126,7 +127,7 @@ static void p1022ds_set_gamma_table(int monitor_port, char *gamma_table_base) ...@@ -126,7 +127,7 @@ static void p1022ds_set_gamma_table(int monitor_port, char *gamma_table_base)
* p1022ds_set_monitor_port: switch the output to a different monitor port * p1022ds_set_monitor_port: switch the output to a different monitor port
* *
*/ */
static void p1022ds_set_monitor_port(int monitor_port) static void p1022ds_set_monitor_port(enum fsl_diu_monitor_port port)
{ {
struct device_node *pixis_node; struct device_node *pixis_node;
u8 __iomem *brdcfg1; u8 __iomem *brdcfg1;
...@@ -144,19 +145,21 @@ static void p1022ds_set_monitor_port(int monitor_port) ...@@ -144,19 +145,21 @@ static void p1022ds_set_monitor_port(int monitor_port)
} }
brdcfg1 += 9; /* BRDCFG1 is at offset 9 in the ngPIXIS */ brdcfg1 += 9; /* BRDCFG1 is at offset 9 in the ngPIXIS */
switch (monitor_port) { switch (port) {
case 0: /* DVI */ case FSL_DIU_PORT_DVI:
printk(KERN_INFO "%s:%u\n", __func__, __LINE__);
/* Enable the DVI port, disable the DFP and the backlight */ /* Enable the DVI port, disable the DFP and the backlight */
clrsetbits_8(brdcfg1, PX_BRDCFG1_DFPEN | PX_BRDCFG1_BACKLIGHT, clrsetbits_8(brdcfg1, PX_BRDCFG1_DFPEN | PX_BRDCFG1_BACKLIGHT,
PX_BRDCFG1_DVIEN); PX_BRDCFG1_DVIEN);
break; break;
case 1: /* Single link LVDS */ case FSL_DIU_PORT_LVDS:
printk(KERN_INFO "%s:%u\n", __func__, __LINE__);
/* Enable the DFP port, disable the DVI and the backlight */ /* Enable the DFP port, disable the DVI and the backlight */
clrsetbits_8(brdcfg1, PX_BRDCFG1_DVIEN | PX_BRDCFG1_BACKLIGHT, clrsetbits_8(brdcfg1, PX_BRDCFG1_DVIEN | PX_BRDCFG1_BACKLIGHT,
PX_BRDCFG1_DFPEN); PX_BRDCFG1_DFPEN);
break; break;
default: default:
pr_err("p1022ds: unsupported monitor port %i\n", monitor_port); pr_err("p1022ds: unsupported monitor port %i\n", port);
} }
} }
...@@ -204,23 +207,18 @@ void p1022ds_set_pixel_clock(unsigned int pixclock) ...@@ -204,23 +207,18 @@ void p1022ds_set_pixel_clock(unsigned int pixclock)
} }
/** /**
* p1022ds_show_monitor_port: show the current monitor * p1022ds_valid_monitor_port: set the monitor port for sysfs
*
* This function returns a string indicating whether the current monitor is
* set to DVI or LVDS.
*/
ssize_t p1022ds_show_monitor_port(int monitor_port, char *buf)
{
return sprintf(buf, "%c0 - DVI\n%c1 - Single link LVDS\n",
monitor_port == 0 ? '*' : ' ', monitor_port == 1 ? '*' : ' ');
}
/**
* p1022ds_set_sysfs_monitor_port: set the monitor port for sysfs
*/ */
int p1022ds_set_sysfs_monitor_port(int val) enum fsl_diu_monitor_port
p1022ds_valid_monitor_port(enum fsl_diu_monitor_port port)
{ {
return val < 2 ? val : 0; switch (port) {
case FSL_DIU_PORT_DVI:
case FSL_DIU_PORT_LVDS:
return port;
default:
return FSL_DIU_PORT_DVI; /* Dual-link LVDS is not supported */
}
} }
#endif #endif
...@@ -295,8 +293,7 @@ static void __init p1022_ds_setup_arch(void) ...@@ -295,8 +293,7 @@ static void __init p1022_ds_setup_arch(void)
diu_ops.set_gamma_table = p1022ds_set_gamma_table; diu_ops.set_gamma_table = p1022ds_set_gamma_table;
diu_ops.set_monitor_port = p1022ds_set_monitor_port; diu_ops.set_monitor_port = p1022ds_set_monitor_port;
diu_ops.set_pixel_clock = p1022ds_set_pixel_clock; diu_ops.set_pixel_clock = p1022ds_set_pixel_clock;
diu_ops.show_monitor_port = p1022ds_show_monitor_port; diu_ops.valid_monitor_port = p1022ds_valid_monitor_port;
diu_ops.set_sysfs_monitor_port = p1022ds_set_sysfs_monitor_port;
#endif #endif
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
......
...@@ -145,10 +145,10 @@ machine_device_initcall(mpc86xx_hpcd, mpc8610_declare_of_platform_devices); ...@@ -145,10 +145,10 @@ machine_device_initcall(mpc86xx_hpcd, mpc8610_declare_of_platform_devices);
(c2 << AD_COMP_2_SHIFT) | (c1 << AD_COMP_1_SHIFT) | \ (c2 << AD_COMP_2_SHIFT) | (c1 << AD_COMP_1_SHIFT) | \
(c0 << AD_COMP_0_SHIFT) | (size << AD_PIXEL_S_SHIFT)) (c0 << AD_COMP_0_SHIFT) | (size << AD_PIXEL_S_SHIFT))
unsigned int mpc8610hpcd_get_pixel_format(unsigned int bits_per_pixel, u32 mpc8610hpcd_get_pixel_format(enum fsl_diu_monitor_port port,
int monitor_port) unsigned int bits_per_pixel)
{ {
static const unsigned long pixelformat[][3] = { static const u32 pixelformat[][3] = {
{ {
MAKE_AD(3, 0, 2, 1, 3, 8, 8, 8, 8), MAKE_AD(3, 0, 2, 1, 3, 8, 8, 8, 8),
MAKE_AD(4, 2, 0, 1, 2, 8, 8, 8, 0), MAKE_AD(4, 2, 0, 1, 2, 8, 8, 8, 0),
...@@ -163,7 +163,8 @@ unsigned int mpc8610hpcd_get_pixel_format(unsigned int bits_per_pixel, ...@@ -163,7 +163,8 @@ unsigned int mpc8610hpcd_get_pixel_format(unsigned int bits_per_pixel,
unsigned int arch_monitor; unsigned int arch_monitor;
/* The DVI port is mis-wired on revision 1 of this board. */ /* The DVI port is mis-wired on revision 1 of this board. */
arch_monitor = ((*pixis_arch == 0x01) && (monitor_port == 0))? 0 : 1; arch_monitor =
((*pixis_arch == 0x01) && (port == FSL_DIU_PORT_DVI)) ? 0 : 1;
switch (bits_per_pixel) { switch (bits_per_pixel) {
case 32: case 32:
...@@ -178,10 +179,11 @@ unsigned int mpc8610hpcd_get_pixel_format(unsigned int bits_per_pixel, ...@@ -178,10 +179,11 @@ unsigned int mpc8610hpcd_get_pixel_format(unsigned int bits_per_pixel,
} }
} }
void mpc8610hpcd_set_gamma_table(int monitor_port, char *gamma_table_base) void mpc8610hpcd_set_gamma_table(enum fsl_diu_monitor_port port,
char *gamma_table_base)
{ {
int i; int i;
if (monitor_port == 2) { /* dual link LVDS */ if (port == FSL_DIU_PORT_DLVDS) {
for (i = 0; i < 256*3; i++) for (i = 0; i < 256*3; i++)
gamma_table_base[i] = (gamma_table_base[i] << 2) | gamma_table_base[i] = (gamma_table_base[i] << 2) |
((gamma_table_base[i] >> 6) & 0x03); ((gamma_table_base[i] >> 6) & 0x03);
...@@ -192,17 +194,21 @@ void mpc8610hpcd_set_gamma_table(int monitor_port, char *gamma_table_base) ...@@ -192,17 +194,21 @@ void mpc8610hpcd_set_gamma_table(int monitor_port, char *gamma_table_base)
#define PX_BRDCFG0_DLINK (1 << 4) #define PX_BRDCFG0_DLINK (1 << 4)
#define PX_BRDCFG0_DIU_MASK (PX_BRDCFG0_DVISEL | PX_BRDCFG0_DLINK) #define PX_BRDCFG0_DIU_MASK (PX_BRDCFG0_DVISEL | PX_BRDCFG0_DLINK)
void mpc8610hpcd_set_monitor_port(int monitor_port) void mpc8610hpcd_set_monitor_port(enum fsl_diu_monitor_port port)
{ {
static const u8 bdcfg[] = { switch (port) {
PX_BRDCFG0_DVISEL | PX_BRDCFG0_DLINK, case FSL_DIU_PORT_DVI:
PX_BRDCFG0_DLINK,
0,
};
if (monitor_port < 3)
clrsetbits_8(pixis_bdcfg0, PX_BRDCFG0_DIU_MASK, clrsetbits_8(pixis_bdcfg0, PX_BRDCFG0_DIU_MASK,
bdcfg[monitor_port]); PX_BRDCFG0_DVISEL | PX_BRDCFG0_DLINK);
break;
case FSL_DIU_PORT_LVDS:
clrsetbits_8(pixis_bdcfg0, PX_BRDCFG0_DIU_MASK,
PX_BRDCFG0_DLINK);
break;
case FSL_DIU_PORT_DLVDS:
clrbits8(pixis_bdcfg0, PX_BRDCFG0_DIU_MASK);
break;
}
} }
void mpc8610hpcd_set_pixel_clock(unsigned int pixclock) void mpc8610hpcd_set_pixel_clock(unsigned int pixclock)
...@@ -273,20 +279,10 @@ void mpc8610hpcd_set_pixel_clock(unsigned int pixclock) ...@@ -273,20 +279,10 @@ void mpc8610hpcd_set_pixel_clock(unsigned int pixclock)
iounmap(clkdvdr); iounmap(clkdvdr);
} }
ssize_t mpc8610hpcd_show_monitor_port(int monitor_port, char *buf) enum fsl_diu_monitor_port
{ mpc8610hpcd_valid_monitor_port(enum fsl_diu_monitor_port port)
return snprintf(buf, PAGE_SIZE,
"%c0 - DVI\n"
"%c1 - Single link LVDS\n"
"%c2 - Dual link LVDS\n",
monitor_port == 0 ? '*' : ' ',
monitor_port == 1 ? '*' : ' ',
monitor_port == 2 ? '*' : ' ');
}
int mpc8610hpcd_set_sysfs_monitor_port(int val)
{ {
return val < 3 ? val : 0; return port;
} }
#endif #endif
...@@ -318,8 +314,7 @@ static void __init mpc86xx_hpcd_setup_arch(void) ...@@ -318,8 +314,7 @@ static void __init mpc86xx_hpcd_setup_arch(void)
diu_ops.set_gamma_table = mpc8610hpcd_set_gamma_table; diu_ops.set_gamma_table = mpc8610hpcd_set_gamma_table;
diu_ops.set_monitor_port = mpc8610hpcd_set_monitor_port; diu_ops.set_monitor_port = mpc8610hpcd_set_monitor_port;
diu_ops.set_pixel_clock = mpc8610hpcd_set_pixel_clock; diu_ops.set_pixel_clock = mpc8610hpcd_set_pixel_clock;
diu_ops.show_monitor_port = mpc8610hpcd_show_monitor_port; diu_ops.valid_monitor_port = mpc8610hpcd_valid_monitor_port;
diu_ops.set_sysfs_monitor_port = mpc8610hpcd_set_sysfs_monitor_port;
#endif #endif
pixis_node = of_find_compatible_node(NULL, NULL, "fsl,fpga-pixis"); pixis_node = of_find_compatible_node(NULL, NULL, "fsl,fpga-pixis");
......
...@@ -22,15 +22,24 @@ struct device_node; ...@@ -22,15 +22,24 @@ struct device_node;
extern void fsl_rstcr_restart(char *cmd); extern void fsl_rstcr_restart(char *cmd);
#if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE) #if defined(CONFIG_FB_FSL_DIU) || defined(CONFIG_FB_FSL_DIU_MODULE)
/* The different ports that the DIU can be connected to */
enum fsl_diu_monitor_port {
FSL_DIU_PORT_DVI, /* DVI */
FSL_DIU_PORT_LVDS, /* Single-link LVDS */
FSL_DIU_PORT_DLVDS /* Dual-link LVDS */
};
struct platform_diu_data_ops { struct platform_diu_data_ops {
unsigned int (*get_pixel_format) (unsigned int bits_per_pixel, u32 (*get_pixel_format)(enum fsl_diu_monitor_port port,
int monitor_port); unsigned int bpp);
void (*set_gamma_table) (int monitor_port, char *gamma_table_base); void (*set_gamma_table)(enum fsl_diu_monitor_port port,
void (*set_monitor_port) (int monitor_port); char *gamma_table_base);
void (*set_pixel_clock) (unsigned int pixclock); void (*set_monitor_port)(enum fsl_diu_monitor_port port);
ssize_t (*show_monitor_port) (int monitor_port, char *buf); void (*set_pixel_clock)(unsigned int pixclock);
int (*set_sysfs_monitor_port) (int val); enum fsl_diu_monitor_port (*valid_monitor_port)
void (*release_bootmem) (void); (enum fsl_diu_monitor_port port);
void (*release_bootmem)(void);
}; };
extern struct platform_diu_data_ops diu_ops; extern struct platform_diu_data_ops diu_ops;
......
...@@ -31,8 +31,6 @@ ...@@ -31,8 +31,6 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/of_platform.h>
#include <sysdev/fsl_soc.h> #include <sysdev/fsl_soc.h>
#include <linux/fsl-diu-fb.h> #include <linux/fsl-diu-fb.h>
#include "edid.h" #include "edid.h"
...@@ -183,7 +181,8 @@ static struct fb_videomode __devinitdata fsl_diu_mode_db[] = { ...@@ -183,7 +181,8 @@ static struct fb_videomode __devinitdata fsl_diu_mode_db[] = {
static char *fb_mode = "1024x768-32@60"; static char *fb_mode = "1024x768-32@60";
static unsigned long default_bpp = 32; static unsigned long default_bpp = 32;
static int monitor_port; static enum fsl_diu_monitor_port monitor_port;
static char *monitor_string;
#if defined(CONFIG_NOT_COHERENT_CACHE) #if defined(CONFIG_NOT_COHERENT_CACHE)
static u8 *coherence_data; static u8 *coherence_data;
...@@ -201,7 +200,7 @@ struct fsl_diu_data { ...@@ -201,7 +200,7 @@ struct fsl_diu_data {
void *dummy_aoi_virt; void *dummy_aoi_virt;
unsigned int irq; unsigned int irq;
int fb_enabled; int fb_enabled;
int monitor_port; enum fsl_diu_monitor_port monitor_port;
}; };
struct mfb_info { struct mfb_info {
...@@ -281,6 +280,37 @@ static struct diu_hw dr = { ...@@ -281,6 +280,37 @@ static struct diu_hw dr = {
static struct diu_pool pool; static struct diu_pool pool;
/**
* fsl_diu_name_to_port - convert a port name to a monitor port enum
*
* Takes the name of a monitor port ("dvi", "lvds", or "dlvds") and returns
* the enum fsl_diu_monitor_port that corresponds to that string.
*
* For compatibility with older versions, a number ("0", "1", or "2") is also
* supported.
*
* If the string is unknown, DVI is assumed.
*
* If the particular port is not supported by the platform, another port
* (platform-specific) is chosen instead.
*/
static enum fsl_diu_monitor_port fsl_diu_name_to_port(const char *s)
{
enum fsl_diu_monitor_port port = FSL_DIU_PORT_DVI;
unsigned long val;
if (s) {
if (!strict_strtoul(s, 10, &val) && (val <= 2))
port = (enum fsl_diu_monitor_port) val;
else if (strncmp(s, "lvds", 4) == 0)
port = FSL_DIU_PORT_LVDS;
else if (strncmp(s, "dlvds", 5) == 0)
port = FSL_DIU_PORT_DLVDS;
}
return diu_ops.valid_monitor_port(port);
}
/** /**
* fsl_diu_alloc - allocate memory for the DIU * fsl_diu_alloc - allocate memory for the DIU
* @size: number of bytes to allocate * @size: number of bytes to allocate
...@@ -831,9 +861,8 @@ static int fsl_diu_set_par(struct fb_info *info) ...@@ -831,9 +861,8 @@ static int fsl_diu_set_par(struct fb_info *info)
} }
} }
ad->pix_fmt = ad->pix_fmt = diu_ops.get_pixel_format(machine_data->monitor_port,
diu_ops.get_pixel_format(var->bits_per_pixel, var->bits_per_pixel);
machine_data->monitor_port);
ad->addr = cpu_to_le32(info->fix.smem_start); ad->addr = cpu_to_le32(info->fix.smem_start);
ad->src_size_g_alpha = cpu_to_le32((var->yres_virtual << 12) | ad->src_size_g_alpha = cpu_to_le32((var->yres_virtual << 12) |
var->xres_virtual) | mfbi->g_alpha; var->xres_virtual) | mfbi->g_alpha;
...@@ -1439,16 +1468,12 @@ static void free_buf(struct device *dev, struct diu_addr *buf, u32 size, ...@@ -1439,16 +1468,12 @@ static void free_buf(struct device *dev, struct diu_addr *buf, u32 size,
static ssize_t store_monitor(struct device *device, static ssize_t store_monitor(struct device *device,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
int old_monitor_port; enum fsl_diu_monitor_port old_monitor_port;
unsigned long val;
struct fsl_diu_data *machine_data = struct fsl_diu_data *machine_data =
container_of(attr, struct fsl_diu_data, dev_attr); container_of(attr, struct fsl_diu_data, dev_attr);
if (strict_strtoul(buf, 10, &val))
return 0;
old_monitor_port = machine_data->monitor_port; old_monitor_port = machine_data->monitor_port;
machine_data->monitor_port = diu_ops.set_sysfs_monitor_port(val); machine_data->monitor_port = fsl_diu_name_to_port(buf);
if (old_monitor_port != machine_data->monitor_port) { if (old_monitor_port != machine_data->monitor_port) {
/* All AOIs need adjust pixel format /* All AOIs need adjust pixel format
...@@ -1468,7 +1493,17 @@ static ssize_t show_monitor(struct device *device, ...@@ -1468,7 +1493,17 @@ static ssize_t show_monitor(struct device *device,
{ {
struct fsl_diu_data *machine_data = struct fsl_diu_data *machine_data =
container_of(attr, struct fsl_diu_data, dev_attr); container_of(attr, struct fsl_diu_data, dev_attr);
return diu_ops.show_monitor_port(machine_data->monitor_port, buf);
switch (machine_data->monitor_port) {
case FSL_DIU_PORT_DVI:
return sprintf(buf, "DVI\n");
case FSL_DIU_PORT_LVDS:
return sprintf(buf, "Single-link LVDS\n");
case FSL_DIU_PORT_DLVDS:
return sprintf(buf, "Dual-link LVDS\n");
}
return 0;
} }
static int __devinit fsl_diu_probe(struct platform_device *ofdev) static int __devinit fsl_diu_probe(struct platform_device *ofdev)
...@@ -1692,8 +1727,7 @@ static int __init fsl_diu_setup(char *options) ...@@ -1692,8 +1727,7 @@ static int __init fsl_diu_setup(char *options)
if (!*opt) if (!*opt)
continue; continue;
if (!strncmp(opt, "monitor=", 8)) { if (!strncmp(opt, "monitor=", 8)) {
if (!strict_strtoul(opt + 8, 10, &val) && (val <= 2)) monitor_port = fsl_diu_name_to_port(opt + 8);
monitor_port = val;
} else if (!strncmp(opt, "bpp=", 4)) { } else if (!strncmp(opt, "bpp=", 4)) {
if (!strict_strtoul(opt + 4, 10, &val)) if (!strict_strtoul(opt + 4, 10, &val))
default_bpp = val; default_bpp = val;
...@@ -1746,6 +1780,8 @@ static int __init fsl_diu_init(void) ...@@ -1746,6 +1780,8 @@ static int __init fsl_diu_init(void)
if (fb_get_options("fslfb", &option)) if (fb_get_options("fslfb", &option))
return -ENODEV; return -ENODEV;
fsl_diu_setup(option); fsl_diu_setup(option);
#else
monitor_port = fsl_diu_name_to_port(monitor_string);
#endif #endif
printk(KERN_INFO "Freescale DIU driver\n"); printk(KERN_INFO "Freescale DIU driver\n");
...@@ -1812,7 +1848,7 @@ MODULE_PARM_DESC(mode, ...@@ -1812,7 +1848,7 @@ MODULE_PARM_DESC(mode,
"Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" "); "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
module_param_named(bpp, default_bpp, ulong, 0); module_param_named(bpp, default_bpp, ulong, 0);
MODULE_PARM_DESC(bpp, "Specify bit-per-pixel if not specified mode"); MODULE_PARM_DESC(bpp, "Specify bit-per-pixel if not specified mode");
module_param_named(monitor, monitor_port, int, 0); module_param_named(monitor, monitor_string, charp, 0);
MODULE_PARM_DESC(monitor, MODULE_PARM_DESC(monitor, "Specify the monitor port "
"Specify the monitor port (0, 1 or 2) if supported by the platform"); "(\"dvi\", \"lvds\", or \"dlvds\") if supported by the platform");
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册