compatible = "karo,imx6dl-tx6dl", "fsl,imx6dl";
aliases {
- display = &lcd;
- mxcfb0 = &display;
+ display = &mxcfb0;
+ mxcfb0 = &mxcfb0;
};
backlight: backlight {
default-brightness-level = <50>;
};
- display: fb@2 {
+ mxcfb0: fb@2 {
compatible = "fsl,mxc_sdc_fb";
disp_dev = "lcd";
interface_pix_fmt = "RGB24";
int_clk = <1>;
late_init = <0>;
status = "okay";
- };
-
- lcd: lcd@0 {
- compatible = "fsl,lcd";
- ipu_id = <0>;
- disp_id = <0>;
- default_ifmt = "RGB24";
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_disp0_2>;
- status = "okay";
display-timings {
native-mode = <&ET070001DM6>;
};
};
};
+
+ lcd: lcd@0 {
+ compatible = "fsl,lcd";
+ ipu_id = <0>;
+ disp_id = <0>;
+ default_ifmt = "RGB24";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_disp0_2>;
+ status = "okay";
+ };
};
&can1 {
compatible = "karo,imx6q-tx6q", "fsl,imx6q";
aliases {
- display = &lcd;
- mxcfb0 = &display;
+ display = &mxcfb0;
+ mxcfb0 = &mxcfb0;
};
backlight: backlight {
default-brightness-level = <50>;
};
- display: fb@2 {
+ mxcfb0: fb@2 {
compatible = "fsl,mxc_sdc_fb";
disp_dev = "lcd";
interface_pix_fmt = "RGB24";
int_clk = <1>;
late_init = <0>;
status = "okay";
- };
-
- lcd: lcd@0 {
- compatible = "fsl,lcd";
- ipu_id = <0>;
- disp_id = <0>;
- default_ifmt = "RGB24";
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_disp0_2>;
- status = "okay";
display-timings {
native-mode = <&ET070001DM6>;
};
};
};
+
+ lcd: lcd@0 {
+ compatible = "fsl,lcd";
+ ipu_id = <0>;
+ disp_id = <0>;
+ default_ifmt = "RGB24";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_disp0_2>;
+ status = "okay";
+ };
};
&can1 {
compatible = "karo,imx6q-tx6q", "fsl,imx6q";
aliases {
- display = &lcd;
- mxcfb0 = &display;
+ display = &mxcfb0;
+ mxcfb0 = &mxcfb0;
};
backlight: backlight {
default-brightness-level = <50>;
};
- display: fb@2 {
+ mxcfb0: fb@2 {
compatible = "fsl,mxc_sdc_fb";
disp_dev = "lcd";
interface_pix_fmt = "RGB24";
int_clk = <1>;
late_init = <0>;
status = "okay";
- };
-
- lcd: lcd@0 {
- compatible = "fsl,lcd";
- ipu_id = <0>;
- disp_id = <0>;
- default_ifmt = "RGB24";
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_disp0_2>;
- status = "okay";
display-timings {
VGA {
};
};
};
+
+ lcd: lcd@0 {
+ compatible = "fsl,lcd";
+ ipu_id = <0>;
+ disp_id = <0>;
+ default_ifmt = "RGB24";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pinctrl_disp0_2>;
+ status = "okay";
+ };
};
&ds1339 {
return err;
}
- if (of_display_timings_exist(np) == 1) {
- struct videomode vm = { };
-
- err = of_get_videomode(np, &vm, OF_USE_NATIVE_MODE);
- if (err == 0) {
- fb_videomode_from_videomode(&vm, &ldb_modedb[0]);
- ldb_modedb_sz = 1;
- }
- }
-
plat_data->mode = parse_ldb_mode(mode);
plat_data->ext_ref = ext_ref;
plat_data->ipu_id = ipu_id;
if (is_imx6_ldb(plat_data))
ldb_ipu_ldb_route(setting->dev_id, setting->disp_id, ldb);
+ if (setting->fbmode) {
+ ldb_modedb[0] = *setting->fbmode;
+ ldb_modedb_sz = 1;
+ }
+
/* must use spec video mode defined by driver */
ret = fb_find_mode(&setting->fbi->var, setting->fbi, setting->dft_mode_str,
ldb_modedb, ldb_modedb_sz, NULL, setting->default_bpp);
int dev_id;
int disp_id;
enum display_flags disp_flags;
+
+ struct fb_videomode *fbmode;
};
struct mxc_dispdrv_driver {
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/uaccess.h>
-
+#include <video/of_display_timing.h>
+#include <video/of_videomode.h>
+#include <video/videomode.h>
#include "mxc_dispdrv.h"
/*
struct fb_info *fbi)
{
struct ipuv3_fb_platform_data *plat_data = pdev->dev.platform_data;
- struct mxcfb_info *mxcfbi = (struct mxcfb_info *)fbi->par;
+ struct device_node *np = pdev->dev.of_node;
+ struct mxcfb_info *mxcfbi = fbi->par;
struct mxc_dispdrv_setting setting = {};
char disp_dev[32], *default_dev = "lcd";
int ret = 0;
else
strlcpy(disp_dev, plat_data->disp_dev, sizeof(disp_dev));
+ if (of_display_timings_exist(np) == 1) {
+ struct videomode vm = { };
+
+ setting.fbmode = kzalloc(sizeof(*setting.fbmode), GFP_KERNEL);
+ if (setting.fbmode == NULL)
+ return -ENOMEM;
+
+ ret = of_get_videomode(np, &vm, OF_USE_NATIVE_MODE);
+ if (ret)
+ goto err;
+
+ fb_videomode_from_videomode(&vm, setting.fbmode);
+ setting.disp_flags = vm.flags;
+ dev_dbg(&pdev->dev, "using video mode from DTB\n");
+ }
dev_info(&pdev->dev, "register mxc display driver %s\n", disp_dev);
if (IS_ERR(mxcfbi->dispdrv)) {
ret = PTR_ERR(mxcfbi->dispdrv);
dev_err(&pdev->dev, "NO mxc display driver found!\n");
- return ret;
+ goto err;
} else {
/* fix-up */
mxcfbi->ipu_di_pix_fmt = setting.if_fmt;
setting.disp_id, setting.dev_id);
}
+err:
+ kfree(setting.fbmode);
return ret;
}
/*
* Parse user specified options (`video=trident:')
* example:
- * video=mxcfb0:dev=lcd,800x480M-16@55,if=RGB565,bpp=16,noaccel
+ * video=mxcfb0:dev=lcd,800x480M-16@55,if=RGB565,bpp=16,noaccel
* video=mxcfb0:dev=lcd,800x480M-16@55,if=RGB565,fbpix=RGB565
*/
static int mxcfb_option_setup(struct platform_device *pdev, struct fb_info *fbi)
/* use platform defined ipu/di */
setting->dev_id = plat_data->ipu_id;
setting->disp_id = plat_data->disp_id;
- setting->disp_flags = plat_data->disp_flags;
+
+ if (setting->fbmode) {
+ modedb[0] = *setting->fbmode;
+ modedb_sz = 1;
+ } else {
+ setting->disp_flags = plat_data->disp_flags;
+ }
ret = fb_find_mode(&setting->fbi->var, setting->fbi, setting->dft_mode_str,
modedb, modedb_sz, NULL, setting->default_bpp);
return err;
}
- {
- struct videomode vm = { };
-
- err = of_get_videomode(np, &vm, OF_USE_NATIVE_MODE);
- if (err == 0) {
- dev_dbg(dev, "Copying videomode from display-timings\n");
- fb_videomode_from_videomode(&vm, &lcdif_modedb[0]);
- plat_data->disp_flags = vm.flags;
- lcdif_modedb_sz = 1;
- }
- }
-
plat_data->ipu_id = ipu_id;
plat_data->disp_id = disp_id;
if (!strncmp(default_ifmt, "RGB24", 5))