Message ID | 1346859555-13527-3-git-send-email-l.krishna@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, On Thu, Sep 6, 2012 at 12:39 AM, Leela Krishna Amudala <l.krishna@samsung.com> wrote: > Add device tree based discovery support for DRM-FIMD driver. > > Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com> > --- > Documentation/devicetree/bindings/fb/drm-fimd.txt | 80 +++++++++++++++++ > drivers/gpu/drm/exynos/exynos_drm_fimd.c | 95 ++++++++++++++++++++- > 2 files changed, 173 insertions(+), 2 deletions(-) > create mode 100644 Documentation/devicetree/bindings/fb/drm-fimd.txt > > diff --git a/Documentation/devicetree/bindings/fb/drm-fimd.txt b/Documentation/devicetree/bindings/fb/drm-fimd.txt > new file mode 100644 > index 0000000..4ff1829 > --- /dev/null > +++ b/Documentation/devicetree/bindings/fb/drm-fimd.txt > @@ -0,0 +1,80 @@ > +* Samsung Display Controller using DRM frame work > + > +The display controller is used to transfer image data from memory to an > +external LCD driver interface. It supports various color formats such as > +rgb and yuv. > + > +Required properties: > + - compatible: Should be "samsung,exynos5-fimd" or "samsung,exynos4-fb" for Doesn't better to use single word? fimd or fb?. I think 'fb' is used for framebuffer historically. but now it's used both fb and drm, so fimd is neutral and architecture specific. To do this, Modify arch-exynos first and update it at each drivers it properly. Thank you, Kyungmin Park > + fimd using DRM frame work. > + - reg: physical base address of the controller and length of memory > + mapped region. > + - interrupts: Three interrupts should be specified. The interrupts should be > + specified in the following order. > + - VSYNC interrupt > + - FIFO level interrupt > + - FIMD System Interrupt > + > + - samsung,fimd-display: This property should specify the phandle of the > + display device node which holds the video interface timing with the > + below mentioned properties. > + > + - lcd-htiming: Specifies the horizontal timing for the overlay. The > + horizontal timing includes four parameters in the following order. > + > + - horizontal back porch (in number of lcd clocks) > + - horizontal front porch (in number of lcd clocks) > + - hsync pulse width (in number of lcd clocks) > + - Display panels X resolution. > + > + - lcd-vtiming: Specifies the vertical timing for the overlay. The > + vertical timing includes four parameters in the following order. > + > + - vertical back porch (in number of lcd lines) > + - vertical front porch (in number of lcd lines) > + - vsync pulse width (in number of lcd clocks) > + - Display panels Y resolution. > + > + > + - samsung,default-window: Specifies the default window number of the fimd controller. > + > + - samsung,fimd-win-bpp: Specifies the bits per pixel. > + > +Optional properties: > + - samsung,fimd-vidout-rgb: Video output format is RGB. > + - samsung,fimd-inv-vclk: invert video clock polarity. > + - samsung,fimd-frame-rate: Number of video frames per second. > + > +Example: > + > + The following is an example for the fimd controller is split into > + two portions. The SoC specific portion can be specified in the SoC > + specific dts file. The board specific portion can be specified in the > + board specific dts file. > + > + - SoC Specific portion > + > + fimd { > + compatible = "samsung,exynos5-fimd"; > + interrupt-parent = <&combiner>; > + reg = <0x14400000 0x40000>; > + interrupts = <18 5>, <18 4>, <18 6>; > + }; > + > + - Board Specific portion > + > + lcd_fimd0: lcd_panel0 { > + lcd-htiming = <4 4 4 480>; > + lcd-vtiming = <4 4 4 320>; > + supports-mipi-panel; > + }; > + > + fimd { > + samsung,fimd-display = <&lcd_fimd0>; > + samsung,fimd-vidout-rgb; > + samsung,fimd-inv-vclk; > + samsung,fimd-frame-rate = <60>; > + samsung,default-window = <0>; > + samsung,fimd-win-bpp = <32>; > + }; > + > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c > index 3701fbe..a4fa8e9 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c > @@ -18,6 +18,7 @@ > #include <linux/platform_device.h> > #include <linux/clk.h> > #include <linux/pm_runtime.h> > +#include <linux/of.h> > > #include <video/samsung_fimd.h> > #include <drm/exynos_drm.h> > @@ -103,9 +104,18 @@ struct fimd_context { > struct exynos_drm_panel_info *panel; > }; > > +static const struct of_device_id fimd_dt_match[]; > + > static inline struct fimd_driver_data *drm_fimd_get_driver_data( > struct platform_device *pdev) > { > +#ifdef CONFIG_OF > + if (pdev->dev.of_node) { > + const struct of_device_id *match; > + match = of_match_ptr(fimd_dt_match); > + return (struct fimd_driver_data *)match->data; > + } > +#endif > return (struct fimd_driver_data *) > platform_get_device_id(pdev)->driver_data; > } > @@ -809,12 +819,77 @@ static int fimd_power_on(struct fimd_context *ctx, bool enable) > return 0; > } > > +#ifdef CONFIG_OF > +static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device *dev) > +{ > + struct device_node *np = dev->of_node; > + struct device_node *disp_np; > + struct exynos_drm_fimd_pdata *pd; > + u32 data[4]; > + > + pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); > + if (!pd) { > + dev_err(dev, "memory allocation for pdata failed\n"); > + return ERR_PTR(-ENOMEM); > + } > + > + if (of_get_property(np, "samsung,fimd-vidout-rgb", NULL)) > + pd->vidcon0 |= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB; > + if (of_get_property(np, "samsung,fimd-inv-hsync", NULL)) > + pd->vidcon1 |= VIDCON1_INV_HSYNC; > + if (of_get_property(np, "samsung,fimd-inv-vsync", NULL)) > + pd->vidcon1 |= VIDCON1_INV_VSYNC; > + if (of_get_property(np, "samsung,fimd-inv-vclk", NULL)) > + pd->vidcon1 |= VIDCON1_INV_VCLK; > + if (of_get_property(np, "samsung,fimd-inv-vden", NULL)) > + pd->vidcon1 |= VIDCON1_INV_VDEN; > + > + disp_np = of_parse_phandle(np, "samsung,fimd-display", 0); > + if (!disp_np) { > + dev_err(dev, "unable to find display panel info\n"); > + return ERR_PTR(-EINVAL); > + } > + > + if (of_property_read_u32_array(disp_np, "lcd-htiming", data, 4)) { > + dev_err(dev, "invalid horizontal timing\n"); > + return ERR_PTR(-EINVAL); > + } > + pd->panel.timing.left_margin = data[0]; > + pd->panel.timing.right_margin = data[1]; > + pd->panel.timing.hsync_len = data[2]; > + pd->panel.timing.xres = data[3]; > + > + if (of_property_read_u32_array(disp_np, "lcd-vtiming", data, 4)) { > + dev_err(dev, "invalid vertical timing\n"); > + return ERR_PTR(-EINVAL); > + } > + pd->panel.timing.upper_margin = data[0]; > + pd->panel.timing.lower_margin = data[1]; > + pd->panel.timing.vsync_len = data[2]; > + pd->panel.timing.yres = data[3]; > + > + of_property_read_u32(np, "samsung,fimd-frame-rate", > + &pd->panel.timing.refresh); > + > + of_property_read_u32(np, "samsung,default-window", &pd->default_win); > + > + of_property_read_u32(np, "samsung,fimd-win-bpp", &pd->bpp); > + > + return pd; > +} > +#else > +static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device *dev) > +{ > + return NULL; > +} > +#endif /* CONFIG_OF */ > + > static int __devinit fimd_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > struct fimd_context *ctx; > struct exynos_drm_subdrv *subdrv; > - struct exynos_drm_fimd_pdata *pdata; > + struct exynos_drm_fimd_pdata *pdata = pdev->dev.platform_data; > struct exynos_drm_panel_info *panel; > struct resource *res; > int win; > @@ -822,7 +897,11 @@ static int __devinit fimd_probe(struct platform_device *pdev) > > DRM_DEBUG_KMS("%s\n", __FILE__); > > - pdata = pdev->dev.platform_data; > + if (pdev->dev.of_node) { > + pdata = drm_fimd_dt_parse_pdata(&pdev->dev); > + if (IS_ERR(pdata)) > + return PTR_ERR(pdata); > + } > if (!pdata) { > dev_err(dev, "no platform data specified\n"); > return -EINVAL; > @@ -1016,6 +1095,17 @@ static struct platform_device_id fimd_driver_ids[] = { > }; > MODULE_DEVICE_TABLE(platform, fimd_driver_ids); > > +#ifdef CONFIG_OF > +static const struct of_device_id fimd_dt_match[] = { > + { .compatible = "samsung,exynos5-fimd", > + .data = &exynos5_fimd_driver_data }, > + { .compatible = "samsung,exynos4-fb", > + .data = &exynos4_fimd_driver_data }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, fimd_dt_match); > +#endif > + > static const struct dev_pm_ops fimd_pm_ops = { > SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume) > SET_RUNTIME_PM_OPS(fimd_runtime_suspend, fimd_runtime_resume, NULL) > @@ -1029,5 +1119,6 @@ struct platform_driver fimd_driver = { > .name = "exynos-drm-fimd", > .owner = THIS_MODULE, > .pm = &fimd_pm_ops, > + .of_match_table = of_match_ptr(fimd_dt_match), > }, > }; > -- > 1.7.0.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, 2012/9/5 Kyungmin Park <kmpark@infradead.org>: > Hi, > > On Thu, Sep 6, 2012 at 12:39 AM, Leela Krishna Amudala > <l.krishna@samsung.com> wrote: >> Add device tree based discovery support for DRM-FIMD driver. >> >> Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com> >> --- >> Documentation/devicetree/bindings/fb/drm-fimd.txt | 80 +++++++++++++++++ >> drivers/gpu/drm/exynos/exynos_drm_fimd.c | 95 ++++++++++++++++++++- >> 2 files changed, 173 insertions(+), 2 deletions(-) >> create mode 100644 Documentation/devicetree/bindings/fb/drm-fimd.txt >> >> diff --git a/Documentation/devicetree/bindings/fb/drm-fimd.txt b/Documentation/devicetree/bindings/fb/drm-fimd.txt >> new file mode 100644 >> index 0000000..4ff1829 >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/fb/drm-fimd.txt >> @@ -0,0 +1,80 @@ >> +* Samsung Display Controller using DRM frame work >> + >> +The display controller is used to transfer image data from memory to an >> +external LCD driver interface. It supports various color formats such as >> +rgb and yuv. >> + >> +Required properties: >> + - compatible: Should be "samsung,exynos5-fimd" or "samsung,exynos4-fb" for > Doesn't better to use single word? fimd or fb?. I think 'fb' is used > for framebuffer historically. > but now it's used both fb and drm, so fimd is neutral and architecture > specific. > > To do this, Modify arch-exynos first and update it at each drivers it properly. > > Thank you, > Kyungmin Park > I agree with Kyungmin but I'd like to use as is. the reason we used 'exynos4-fb' as device name, is for that it uses fimd driver's platform device commonly and gets fimd clock. so I think that dts file should be defined with hardware specific name but not driver name such as 'exynos4-fb'. but with this, we can't get fimd clock with device's name because 'exynos4-fb' is used as device name of fimd clock. so to use 'exynos4-fimd', we should modify the device name of fimd clock from 'exynos4-fb' to 'exynos4-fimd' and also ids definitions of s3c-fb and drm fimd driver. so my conclusion is that it merges this patch set as is and then let's modify related things later. any opinions, welcome~ anytime. Thanks. Inki Dae
Hi, On 09/06/2012 09:21 AM, InKi Dae wrote: >>> +Required properties: >>> + - compatible: Should be "samsung,exynos5-fimd" or "samsung,exynos4-fb" for >> Doesn't better to use single word? fimd or fb?. I think 'fb' is used >> for framebuffer historically. >> but now it's used both fb and drm, so fimd is neutral and architecture >> specific. >> >> To do this, Modify arch-exynos first and update it at each drivers it properly. >> >> Thank you, >> Kyungmin Park >> > > I agree with Kyungmin but I'd like to use as is. the reason we used > 'exynos4-fb' as device name, is for that it uses fimd driver's > platform device commonly and gets fimd clock. so I think that dts file > should be defined with hardware specific name but not driver name such > as 'exynos4-fb'. but with this, we can't get fimd clock with device's > name because 'exynos4-fb' is used as device name of fimd clock. so to > use 'exynos4-fimd', we should modify the device name of fimd clock > from 'exynos4-fb' to 'exynos4-fimd' and also ids definitions of > s3c-fb and drm fimd driver. so my conclusion is that it merges this I think it's good moment to put those things in order, i.e. use uniform 'compatible' names: "samsung,exynos4-fimd", "samsung,exynos5-fimd". Platform device names are separate issue, but could perhaps be unified at this time as well. > patch set as is and then let's modify related things later. > any opinions, welcome~ anytime. > > Thanks. > Inki Dae -- Regards, Sylwester
Hi, On Thu, Sep 6, 2012 at 4:35 PM, Sylwester Nawrocki <s.nawrocki@samsung.com> wrote: > Hi, > > On 09/06/2012 09:21 AM, InKi Dae wrote: >>>> +Required properties: >>>> + - compatible: Should be "samsung,exynos5-fimd" or "samsung,exynos4-fb" for >>> Doesn't better to use single word? fimd or fb?. I think 'fb' is used >>> for framebuffer historically. >>> but now it's used both fb and drm, so fimd is neutral and architecture >>> specific. >>> >>> To do this, Modify arch-exynos first and update it at each drivers it properly. >>> >>> Thank you, >>> Kyungmin Park >>> >> >> I agree with Kyungmin but I'd like to use as is. the reason we used >> 'exynos4-fb' as device name, is for that it uses fimd driver's >> platform device commonly and gets fimd clock. so I think that dts file >> should be defined with hardware specific name but not driver name such >> as 'exynos4-fb'. but with this, we can't get fimd clock with device's >> name because 'exynos4-fb' is used as device name of fimd clock. so to >> use 'exynos4-fimd', we should modify the device name of fimd clock >> from 'exynos4-fb' to 'exynos4-fimd' and also ids definitions of >> s3c-fb and drm fimd driver. so my conclusion is that it merges this > > I think it's good moment to put those things in order, i.e. use uniform > 'compatible' names: "samsung,exynos4-fimd", "samsung,exynos5-fimd". > Platform device names are separate issue, but could perhaps be unified > at this time as well. Yes, Platform device name is independent of compatible string. Will change the compatible string to "samsung,exynos4-fimd" and will keep the device name as exynos4-fb for now. Will change the platform device names to exynosX-fimd later. > >> patch set as is and then let's modify related things later. >> any opinions, welcome~ anytime. >> >> Thanks. >> Inki Dae > > -- > > Regards, > Sylwester > -- > To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi 2012/9/7 Leela Krishna Amudala <l.krishna@samsung.com>: > Hi, > > On Thu, Sep 6, 2012 at 4:35 PM, Sylwester Nawrocki > <s.nawrocki@samsung.com> wrote: >> Hi, >> >> On 09/06/2012 09:21 AM, InKi Dae wrote: >>>>> +Required properties: >>>>> + - compatible: Should be "samsung,exynos5-fimd" or "samsung,exynos4-fb" for >>>> Doesn't better to use single word? fimd or fb?. I think 'fb' is used >>>> for framebuffer historically. >>>> but now it's used both fb and drm, so fimd is neutral and architecture >>>> specific. >>>> >>>> To do this, Modify arch-exynos first and update it at each drivers it properly. >>>> >>>> Thank you, >>>> Kyungmin Park >>>> >>> >>> I agree with Kyungmin but I'd like to use as is. the reason we used >>> 'exynos4-fb' as device name, is for that it uses fimd driver's >>> platform device commonly and gets fimd clock. so I think that dts file >>> should be defined with hardware specific name but not driver name such >>> as 'exynos4-fb'. but with this, we can't get fimd clock with device's >>> name because 'exynos4-fb' is used as device name of fimd clock. so to >>> use 'exynos4-fimd', we should modify the device name of fimd clock >>> from 'exynos4-fb' to 'exynos4-fimd' and also ids definitions of >>> s3c-fb and drm fimd driver. so my conclusion is that it merges this >> >> I think it's good moment to put those things in order, i.e. use uniform >> 'compatible' names: "samsung,exynos4-fimd", "samsung,exynos5-fimd". >> Platform device names are separate issue, but could perhaps be unified >> at this time as well. > > Yes, Platform device name is independent of compatible string. > Will change the compatible string to "samsung,exynos4-fimd" and will keep the > device name as exynos4-fb for now. Will change the platform device > names to exynosX-fimd > later. > I'm not sure that clk_get is worked well with this change. I think, when driver called clk_get(), first of all, it tries to get a clk from the registered list of clock providers in the dts file and next in legacy way. but now legacy way(needing clock name and device' name) would be failed if the dts file has no the list because platform device's name differs from device name of clock. so I think we should change device name of clock and also ids of related drivers for compatibility with non-dt. for this, we need some patch sets, changing arch/arm/mach-exynos/common.c and changing arch/arm/mach-exynos/clock-exynos4/5.c and changing s3c-fb.c and last this patch. if there are no other opinions, I'd like to merge this patch set(v5) and next we can update others(maybe common.c, clock-exynos4/5.c and s3c-fb.c) later. Thanks. Inki Dae >> >>> patch set as is and then let's modify related things later. >>> any opinions, welcome~ anytime. >>> >>> Thanks. >>> Inki Dae >> >> -- >> >> Regards, >> Sylwester >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel
2012/9/7 Inki Dae <inki.dae@samsung.com>: > Hi > > 2012/9/7 Leela Krishna Amudala <l.krishna@samsung.com>: >> Hi, >> >> On Thu, Sep 6, 2012 at 4:35 PM, Sylwester Nawrocki >> <s.nawrocki@samsung.com> wrote: >>> Hi, >>> >>> On 09/06/2012 09:21 AM, InKi Dae wrote: >>>>>> +Required properties: >>>>>> + - compatible: Should be "samsung,exynos5-fimd" or "samsung,exynos4-fb" for >>>>> Doesn't better to use single word? fimd or fb?. I think 'fb' is used >>>>> for framebuffer historically. >>>>> but now it's used both fb and drm, so fimd is neutral and architecture >>>>> specific. >>>>> >>>>> To do this, Modify arch-exynos first and update it at each drivers it properly. >>>>> >>>>> Thank you, >>>>> Kyungmin Park >>>>> >>>> >>>> I agree with Kyungmin but I'd like to use as is. the reason we used >>>> 'exynos4-fb' as device name, is for that it uses fimd driver's >>>> platform device commonly and gets fimd clock. so I think that dts file >>>> should be defined with hardware specific name but not driver name such >>>> as 'exynos4-fb'. but with this, we can't get fimd clock with device's >>>> name because 'exynos4-fb' is used as device name of fimd clock. so to >>>> use 'exynos4-fimd', we should modify the device name of fimd clock >>>> from 'exynos4-fb' to 'exynos4-fimd' and also ids definitions of >>>> s3c-fb and drm fimd driver. so my conclusion is that it merges this >>> >>> I think it's good moment to put those things in order, i.e. use uniform >>> 'compatible' names: "samsung,exynos4-fimd", "samsung,exynos5-fimd". >>> Platform device names are separate issue, but could perhaps be unified >>> at this time as well. >> >> Yes, Platform device name is independent of compatible string. >> Will change the compatible string to "samsung,exynos4-fimd" and will keep the >> device name as exynos4-fb for now. Will change the platform device >> names to exynosX-fimd >> later. >> > > I'm not sure that clk_get is worked well with this change. I think, > when driver called clk_get(), first of all, it tries to get a clk from > the registered list of clock providers in the dts file and next in > legacy way. but now legacy way(needing clock name and device' name) > would be failed if the dts file has no the list because platform > device's name differs from device name of clock. so I think we should > change device name of clock and also ids of related drivers for > compatibility with non-dt. for this, we need some patch sets, changing > arch/arm/mach-exynos/common.c and changing > arch/arm/mach-exynos/clock-exynos4/5.c and changing s3c-fb.c and last > this patch. if there are no other opinions, I'd like to merge this > patch set(v5) and next we can update others(maybe common.c, > clock-exynos4/5.c and s3c-fb.c) later. > there is my missing point. with dt, platform device's name is set by OF_DEV_AUXDATA's name so it doesn't need to modify things related to exynos4 anymore. we just need to update things related to exynos5. Thanks. Inki Dae > Thanks. > Inki Dae > >>> >>>> patch set as is and then let's modify related things later. >>>> any opinions, welcome~ anytime. >>>> >>>> Thanks. >>>> Inki Dae >>> >>> -- >>> >>> Regards, >>> Sylwester >>> -- >>> To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in >>> the body of a message to majordomo@vger.kernel.org >>> More majordomo info at http://vger.kernel.org/majordomo-info.html >> _______________________________________________ >> dri-devel mailing list >> dri-devel@lists.freedesktop.org >> http://lists.freedesktop.org/mailman/listinfo/dri-devel
Hi, I had merged this patch set but I realizes this patch has no descriptions enough so please add the descriptions what is this patch. 2012/9/6 Leela Krishna Amudala <l.krishna@samsung.com>: > Add device tree based discovery support for DRM-FIMD driver. > > Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com> > --- > Documentation/devicetree/bindings/fb/drm-fimd.txt | 80 +++++++++++++++++ and, how about making drm folder instead of fb? so like below; Documentation/devicetree/bindings/drm/exynos/fimd.txt Thanks, Inki Dae > drivers/gpu/drm/exynos/exynos_drm_fimd.c | 95 ++++++++++++++++++++- > 2 files changed, 173 insertions(+), 2 deletions(-) > create mode 100644 Documentation/devicetree/bindings/fb/drm-fimd.txt > > diff --git a/Documentation/devicetree/bindings/fb/drm-fimd.txt b/Documentation/devicetree/bindings/fb/drm-fimd.txt > new file mode 100644 > index 0000000..4ff1829 > --- /dev/null > +++ b/Documentation/devicetree/bindings/fb/drm-fimd.txt > @@ -0,0 +1,80 @@ > +* Samsung Display Controller using DRM frame work > + > +The display controller is used to transfer image data from memory to an > +external LCD driver interface. It supports various color formats such as > +rgb and yuv. > + > +Required properties: > + - compatible: Should be "samsung,exynos5-fimd" or "samsung,exynos4-fb" for > + fimd using DRM frame work. > + - reg: physical base address of the controller and length of memory > + mapped region. > + - interrupts: Three interrupts should be specified. The interrupts should be > + specified in the following order. > + - VSYNC interrupt > + - FIFO level interrupt > + - FIMD System Interrupt > + > + - samsung,fimd-display: This property should specify the phandle of the > + display device node which holds the video interface timing with the > + below mentioned properties. > + > + - lcd-htiming: Specifies the horizontal timing for the overlay. The > + horizontal timing includes four parameters in the following order. > + > + - horizontal back porch (in number of lcd clocks) > + - horizontal front porch (in number of lcd clocks) > + - hsync pulse width (in number of lcd clocks) > + - Display panels X resolution. > + > + - lcd-vtiming: Specifies the vertical timing for the overlay. The > + vertical timing includes four parameters in the following order. > + > + - vertical back porch (in number of lcd lines) > + - vertical front porch (in number of lcd lines) > + - vsync pulse width (in number of lcd clocks) > + - Display panels Y resolution. > + > + > + - samsung,default-window: Specifies the default window number of the fimd controller. > + > + - samsung,fimd-win-bpp: Specifies the bits per pixel. > + > +Optional properties: > + - samsung,fimd-vidout-rgb: Video output format is RGB. > + - samsung,fimd-inv-vclk: invert video clock polarity. > + - samsung,fimd-frame-rate: Number of video frames per second. > + > +Example: > + > + The following is an example for the fimd controller is split into > + two portions. The SoC specific portion can be specified in the SoC > + specific dts file. The board specific portion can be specified in the > + board specific dts file. > + > + - SoC Specific portion > + > + fimd { > + compatible = "samsung,exynos5-fimd"; > + interrupt-parent = <&combiner>; > + reg = <0x14400000 0x40000>; > + interrupts = <18 5>, <18 4>, <18 6>; > + }; > + > + - Board Specific portion > + > + lcd_fimd0: lcd_panel0 { > + lcd-htiming = <4 4 4 480>; > + lcd-vtiming = <4 4 4 320>; > + supports-mipi-panel; > + }; > + > + fimd { > + samsung,fimd-display = <&lcd_fimd0>; > + samsung,fimd-vidout-rgb; > + samsung,fimd-inv-vclk; > + samsung,fimd-frame-rate = <60>; > + samsung,default-window = <0>; > + samsung,fimd-win-bpp = <32>; > + }; > + > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c > index 3701fbe..a4fa8e9 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c > @@ -18,6 +18,7 @@ > #include <linux/platform_device.h> > #include <linux/clk.h> > #include <linux/pm_runtime.h> > +#include <linux/of.h> > > #include <video/samsung_fimd.h> > #include <drm/exynos_drm.h> > @@ -103,9 +104,18 @@ struct fimd_context { > struct exynos_drm_panel_info *panel; > }; > > +static const struct of_device_id fimd_dt_match[]; > + > static inline struct fimd_driver_data *drm_fimd_get_driver_data( > struct platform_device *pdev) > { > +#ifdef CONFIG_OF > + if (pdev->dev.of_node) { > + const struct of_device_id *match; > + match = of_match_ptr(fimd_dt_match); > + return (struct fimd_driver_data *)match->data; > + } > +#endif > return (struct fimd_driver_data *) > platform_get_device_id(pdev)->driver_data; > } > @@ -809,12 +819,77 @@ static int fimd_power_on(struct fimd_context *ctx, bool enable) > return 0; > } > > +#ifdef CONFIG_OF > +static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device *dev) > +{ > + struct device_node *np = dev->of_node; > + struct device_node *disp_np; > + struct exynos_drm_fimd_pdata *pd; > + u32 data[4]; > + > + pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); > + if (!pd) { > + dev_err(dev, "memory allocation for pdata failed\n"); > + return ERR_PTR(-ENOMEM); > + } > + > + if (of_get_property(np, "samsung,fimd-vidout-rgb", NULL)) > + pd->vidcon0 |= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB; > + if (of_get_property(np, "samsung,fimd-inv-hsync", NULL)) > + pd->vidcon1 |= VIDCON1_INV_HSYNC; > + if (of_get_property(np, "samsung,fimd-inv-vsync", NULL)) > + pd->vidcon1 |= VIDCON1_INV_VSYNC; > + if (of_get_property(np, "samsung,fimd-inv-vclk", NULL)) > + pd->vidcon1 |= VIDCON1_INV_VCLK; > + if (of_get_property(np, "samsung,fimd-inv-vden", NULL)) > + pd->vidcon1 |= VIDCON1_INV_VDEN; > + > + disp_np = of_parse_phandle(np, "samsung,fimd-display", 0); > + if (!disp_np) { > + dev_err(dev, "unable to find display panel info\n"); > + return ERR_PTR(-EINVAL); > + } > + > + if (of_property_read_u32_array(disp_np, "lcd-htiming", data, 4)) { > + dev_err(dev, "invalid horizontal timing\n"); > + return ERR_PTR(-EINVAL); > + } > + pd->panel.timing.left_margin = data[0]; > + pd->panel.timing.right_margin = data[1]; > + pd->panel.timing.hsync_len = data[2]; > + pd->panel.timing.xres = data[3]; > + > + if (of_property_read_u32_array(disp_np, "lcd-vtiming", data, 4)) { > + dev_err(dev, "invalid vertical timing\n"); > + return ERR_PTR(-EINVAL); > + } > + pd->panel.timing.upper_margin = data[0]; > + pd->panel.timing.lower_margin = data[1]; > + pd->panel.timing.vsync_len = data[2]; > + pd->panel.timing.yres = data[3]; > + > + of_property_read_u32(np, "samsung,fimd-frame-rate", > + &pd->panel.timing.refresh); > + > + of_property_read_u32(np, "samsung,default-window", &pd->default_win); > + > + of_property_read_u32(np, "samsung,fimd-win-bpp", &pd->bpp); > + > + return pd; > +} > +#else > +static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device *dev) > +{ > + return NULL; > +} > +#endif /* CONFIG_OF */ > + > static int __devinit fimd_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > struct fimd_context *ctx; > struct exynos_drm_subdrv *subdrv; > - struct exynos_drm_fimd_pdata *pdata; > + struct exynos_drm_fimd_pdata *pdata = pdev->dev.platform_data; > struct exynos_drm_panel_info *panel; > struct resource *res; > int win; > @@ -822,7 +897,11 @@ static int __devinit fimd_probe(struct platform_device *pdev) > > DRM_DEBUG_KMS("%s\n", __FILE__); > > - pdata = pdev->dev.platform_data; > + if (pdev->dev.of_node) { > + pdata = drm_fimd_dt_parse_pdata(&pdev->dev); > + if (IS_ERR(pdata)) > + return PTR_ERR(pdata); > + } > if (!pdata) { > dev_err(dev, "no platform data specified\n"); > return -EINVAL; > @@ -1016,6 +1095,17 @@ static struct platform_device_id fimd_driver_ids[] = { > }; > MODULE_DEVICE_TABLE(platform, fimd_driver_ids); > > +#ifdef CONFIG_OF > +static const struct of_device_id fimd_dt_match[] = { > + { .compatible = "samsung,exynos5-fimd", > + .data = &exynos5_fimd_driver_data }, > + { .compatible = "samsung,exynos4-fb", > + .data = &exynos4_fimd_driver_data }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, fimd_dt_match); > +#endif > + > static const struct dev_pm_ops fimd_pm_ops = { > SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume) > SET_RUNTIME_PM_OPS(fimd_runtime_suspend, fimd_runtime_resume, NULL) > @@ -1029,5 +1119,6 @@ struct platform_driver fimd_driver = { > .name = "exynos-drm-fimd", > .owner = THIS_MODULE, > .pm = &fimd_pm_ops, > + .of_match_table = of_match_ptr(fimd_dt_match), > }, > }; > -- > 1.7.0.4 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Hello Inki Dae, On Thu, Sep 20, 2012 at 11:59 AM, Inki Dae <inki.dae@samsung.com> wrote: > Hi, > > I had merged this patch set but I realizes this patch has no > descriptions enough so please add the descriptions what is this patch. > Will give more description and post the next version. > > 2012/9/6 Leela Krishna Amudala <l.krishna@samsung.com>: >> Add device tree based discovery support for DRM-FIMD driver. >> >> Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com> >> --- >> Documentation/devicetree/bindings/fb/drm-fimd.txt | 80 +++++++++++++++++ > > and, how about making drm folder instead of fb? so like below; > Documentation/devicetree/bindings/drm/exynos/fimd.txt > Okay, will move it to the drm folder. Best Wishes, Leela Krishna Amudala. > Thanks, > Inki Dae > >> drivers/gpu/drm/exynos/exynos_drm_fimd.c | 95 ++++++++++++++++++++- >> 2 files changed, 173 insertions(+), 2 deletions(-) >> create mode 100644 Documentation/devicetree/bindings/fb/drm-fimd.txt >> >> diff --git a/Documentation/devicetree/bindings/fb/drm-fimd.txt b/Documentation/devicetree/bindings/fb/drm-fimd.txt >> new file mode 100644 >> index 0000000..4ff1829 >> --- /dev/null >> +++ b/Documentation/devicetree/bindings/fb/drm-fimd.txt >> @@ -0,0 +1,80 @@ >> +* Samsung Display Controller using DRM frame work >> + >> +The display controller is used to transfer image data from memory to an >> +external LCD driver interface. It supports various color formats such as >> +rgb and yuv. >> + >> +Required properties: >> + - compatible: Should be "samsung,exynos5-fimd" or "samsung,exynos4-fb" for >> + fimd using DRM frame work. >> + - reg: physical base address of the controller and length of memory >> + mapped region. >> + - interrupts: Three interrupts should be specified. The interrupts should be >> + specified in the following order. >> + - VSYNC interrupt >> + - FIFO level interrupt >> + - FIMD System Interrupt >> + >> + - samsung,fimd-display: This property should specify the phandle of the >> + display device node which holds the video interface timing with the >> + below mentioned properties. >> + >> + - lcd-htiming: Specifies the horizontal timing for the overlay. The >> + horizontal timing includes four parameters in the following order. >> + >> + - horizontal back porch (in number of lcd clocks) >> + - horizontal front porch (in number of lcd clocks) >> + - hsync pulse width (in number of lcd clocks) >> + - Display panels X resolution. >> + >> + - lcd-vtiming: Specifies the vertical timing for the overlay. The >> + vertical timing includes four parameters in the following order. >> + >> + - vertical back porch (in number of lcd lines) >> + - vertical front porch (in number of lcd lines) >> + - vsync pulse width (in number of lcd clocks) >> + - Display panels Y resolution. >> + >> + >> + - samsung,default-window: Specifies the default window number of the fimd controller. >> + >> + - samsung,fimd-win-bpp: Specifies the bits per pixel. >> + >> +Optional properties: >> + - samsung,fimd-vidout-rgb: Video output format is RGB. >> + - samsung,fimd-inv-vclk: invert video clock polarity. >> + - samsung,fimd-frame-rate: Number of video frames per second. >> + >> +Example: >> + >> + The following is an example for the fimd controller is split into >> + two portions. The SoC specific portion can be specified in the SoC >> + specific dts file. The board specific portion can be specified in the >> + board specific dts file. >> + >> + - SoC Specific portion >> + >> + fimd { >> + compatible = "samsung,exynos5-fimd"; >> + interrupt-parent = <&combiner>; >> + reg = <0x14400000 0x40000>; >> + interrupts = <18 5>, <18 4>, <18 6>; >> + }; >> + >> + - Board Specific portion >> + >> + lcd_fimd0: lcd_panel0 { >> + lcd-htiming = <4 4 4 480>; >> + lcd-vtiming = <4 4 4 320>; >> + supports-mipi-panel; >> + }; >> + >> + fimd { >> + samsung,fimd-display = <&lcd_fimd0>; >> + samsung,fimd-vidout-rgb; >> + samsung,fimd-inv-vclk; >> + samsung,fimd-frame-rate = <60>; >> + samsung,default-window = <0>; >> + samsung,fimd-win-bpp = <32>; >> + }; >> + >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c >> index 3701fbe..a4fa8e9 100644 >> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c >> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c >> @@ -18,6 +18,7 @@ >> #include <linux/platform_device.h> >> #include <linux/clk.h> >> #include <linux/pm_runtime.h> >> +#include <linux/of.h> >> >> #include <video/samsung_fimd.h> >> #include <drm/exynos_drm.h> >> @@ -103,9 +104,18 @@ struct fimd_context { >> struct exynos_drm_panel_info *panel; >> }; >> >> +static const struct of_device_id fimd_dt_match[]; >> + >> static inline struct fimd_driver_data *drm_fimd_get_driver_data( >> struct platform_device *pdev) >> { >> +#ifdef CONFIG_OF >> + if (pdev->dev.of_node) { >> + const struct of_device_id *match; >> + match = of_match_ptr(fimd_dt_match); >> + return (struct fimd_driver_data *)match->data; >> + } >> +#endif >> return (struct fimd_driver_data *) >> platform_get_device_id(pdev)->driver_data; >> } >> @@ -809,12 +819,77 @@ static int fimd_power_on(struct fimd_context *ctx, bool enable) >> return 0; >> } >> >> +#ifdef CONFIG_OF >> +static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device *dev) >> +{ >> + struct device_node *np = dev->of_node; >> + struct device_node *disp_np; >> + struct exynos_drm_fimd_pdata *pd; >> + u32 data[4]; >> + >> + pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); >> + if (!pd) { >> + dev_err(dev, "memory allocation for pdata failed\n"); >> + return ERR_PTR(-ENOMEM); >> + } >> + >> + if (of_get_property(np, "samsung,fimd-vidout-rgb", NULL)) >> + pd->vidcon0 |= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB; >> + if (of_get_property(np, "samsung,fimd-inv-hsync", NULL)) >> + pd->vidcon1 |= VIDCON1_INV_HSYNC; >> + if (of_get_property(np, "samsung,fimd-inv-vsync", NULL)) >> + pd->vidcon1 |= VIDCON1_INV_VSYNC; >> + if (of_get_property(np, "samsung,fimd-inv-vclk", NULL)) >> + pd->vidcon1 |= VIDCON1_INV_VCLK; >> + if (of_get_property(np, "samsung,fimd-inv-vden", NULL)) >> + pd->vidcon1 |= VIDCON1_INV_VDEN; >> + >> + disp_np = of_parse_phandle(np, "samsung,fimd-display", 0); >> + if (!disp_np) { >> + dev_err(dev, "unable to find display panel info\n"); >> + return ERR_PTR(-EINVAL); >> + } >> + >> + if (of_property_read_u32_array(disp_np, "lcd-htiming", data, 4)) { >> + dev_err(dev, "invalid horizontal timing\n"); >> + return ERR_PTR(-EINVAL); >> + } >> + pd->panel.timing.left_margin = data[0]; >> + pd->panel.timing.right_margin = data[1]; >> + pd->panel.timing.hsync_len = data[2]; >> + pd->panel.timing.xres = data[3]; >> + >> + if (of_property_read_u32_array(disp_np, "lcd-vtiming", data, 4)) { >> + dev_err(dev, "invalid vertical timing\n"); >> + return ERR_PTR(-EINVAL); >> + } >> + pd->panel.timing.upper_margin = data[0]; >> + pd->panel.timing.lower_margin = data[1]; >> + pd->panel.timing.vsync_len = data[2]; >> + pd->panel.timing.yres = data[3]; >> + >> + of_property_read_u32(np, "samsung,fimd-frame-rate", >> + &pd->panel.timing.refresh); >> + >> + of_property_read_u32(np, "samsung,default-window", &pd->default_win); >> + >> + of_property_read_u32(np, "samsung,fimd-win-bpp", &pd->bpp); >> + >> + return pd; >> +} >> +#else >> +static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device *dev) >> +{ >> + return NULL; >> +} >> +#endif /* CONFIG_OF */ >> + >> static int __devinit fimd_probe(struct platform_device *pdev) >> { >> struct device *dev = &pdev->dev; >> struct fimd_context *ctx; >> struct exynos_drm_subdrv *subdrv; >> - struct exynos_drm_fimd_pdata *pdata; >> + struct exynos_drm_fimd_pdata *pdata = pdev->dev.platform_data; >> struct exynos_drm_panel_info *panel; >> struct resource *res; >> int win; >> @@ -822,7 +897,11 @@ static int __devinit fimd_probe(struct platform_device *pdev) >> >> DRM_DEBUG_KMS("%s\n", __FILE__); >> >> - pdata = pdev->dev.platform_data; >> + if (pdev->dev.of_node) { >> + pdata = drm_fimd_dt_parse_pdata(&pdev->dev); >> + if (IS_ERR(pdata)) >> + return PTR_ERR(pdata); >> + } >> if (!pdata) { >> dev_err(dev, "no platform data specified\n"); >> return -EINVAL; >> @@ -1016,6 +1095,17 @@ static struct platform_device_id fimd_driver_ids[] = { >> }; >> MODULE_DEVICE_TABLE(platform, fimd_driver_ids); >> >> +#ifdef CONFIG_OF >> +static const struct of_device_id fimd_dt_match[] = { >> + { .compatible = "samsung,exynos5-fimd", >> + .data = &exynos5_fimd_driver_data }, >> + { .compatible = "samsung,exynos4-fb", >> + .data = &exynos4_fimd_driver_data }, >> + {}, >> +}; >> +MODULE_DEVICE_TABLE(of, fimd_dt_match); >> +#endif >> + >> static const struct dev_pm_ops fimd_pm_ops = { >> SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume) >> SET_RUNTIME_PM_OPS(fimd_runtime_suspend, fimd_runtime_resume, NULL) >> @@ -1029,5 +1119,6 @@ struct platform_driver fimd_driver = { >> .name = "exynos-drm-fimd", >> .owner = THIS_MODULE, >> .pm = &fimd_pm_ops, >> + .of_match_table = of_match_ptr(fimd_dt_match), >> }, >> }; >> -- >> 1.7.0.4 >> >> >> _______________________________________________ >> linux-arm-kernel mailing list >> linux-arm-kernel@lists.infradead.org >> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > -- > To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/Documentation/devicetree/bindings/fb/drm-fimd.txt b/Documentation/devicetree/bindings/fb/drm-fimd.txt new file mode 100644 index 0000000..4ff1829 --- /dev/null +++ b/Documentation/devicetree/bindings/fb/drm-fimd.txt @@ -0,0 +1,80 @@ +* Samsung Display Controller using DRM frame work + +The display controller is used to transfer image data from memory to an +external LCD driver interface. It supports various color formats such as +rgb and yuv. + +Required properties: + - compatible: Should be "samsung,exynos5-fimd" or "samsung,exynos4-fb" for + fimd using DRM frame work. + - reg: physical base address of the controller and length of memory + mapped region. + - interrupts: Three interrupts should be specified. The interrupts should be + specified in the following order. + - VSYNC interrupt + - FIFO level interrupt + - FIMD System Interrupt + + - samsung,fimd-display: This property should specify the phandle of the + display device node which holds the video interface timing with the + below mentioned properties. + + - lcd-htiming: Specifies the horizontal timing for the overlay. The + horizontal timing includes four parameters in the following order. + + - horizontal back porch (in number of lcd clocks) + - horizontal front porch (in number of lcd clocks) + - hsync pulse width (in number of lcd clocks) + - Display panels X resolution. + + - lcd-vtiming: Specifies the vertical timing for the overlay. The + vertical timing includes four parameters in the following order. + + - vertical back porch (in number of lcd lines) + - vertical front porch (in number of lcd lines) + - vsync pulse width (in number of lcd clocks) + - Display panels Y resolution. + + + - samsung,default-window: Specifies the default window number of the fimd controller. + + - samsung,fimd-win-bpp: Specifies the bits per pixel. + +Optional properties: + - samsung,fimd-vidout-rgb: Video output format is RGB. + - samsung,fimd-inv-vclk: invert video clock polarity. + - samsung,fimd-frame-rate: Number of video frames per second. + +Example: + + The following is an example for the fimd controller is split into + two portions. The SoC specific portion can be specified in the SoC + specific dts file. The board specific portion can be specified in the + board specific dts file. + + - SoC Specific portion + + fimd { + compatible = "samsung,exynos5-fimd"; + interrupt-parent = <&combiner>; + reg = <0x14400000 0x40000>; + interrupts = <18 5>, <18 4>, <18 6>; + }; + + - Board Specific portion + + lcd_fimd0: lcd_panel0 { + lcd-htiming = <4 4 4 480>; + lcd-vtiming = <4 4 4 320>; + supports-mipi-panel; + }; + + fimd { + samsung,fimd-display = <&lcd_fimd0>; + samsung,fimd-vidout-rgb; + samsung,fimd-inv-vclk; + samsung,fimd-frame-rate = <60>; + samsung,default-window = <0>; + samsung,fimd-win-bpp = <32>; + }; + diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 3701fbe..a4fa8e9 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -18,6 +18,7 @@ #include <linux/platform_device.h> #include <linux/clk.h> #include <linux/pm_runtime.h> +#include <linux/of.h> #include <video/samsung_fimd.h> #include <drm/exynos_drm.h> @@ -103,9 +104,18 @@ struct fimd_context { struct exynos_drm_panel_info *panel; }; +static const struct of_device_id fimd_dt_match[]; + static inline struct fimd_driver_data *drm_fimd_get_driver_data( struct platform_device *pdev) { +#ifdef CONFIG_OF + if (pdev->dev.of_node) { + const struct of_device_id *match; + match = of_match_ptr(fimd_dt_match); + return (struct fimd_driver_data *)match->data; + } +#endif return (struct fimd_driver_data *) platform_get_device_id(pdev)->driver_data; } @@ -809,12 +819,77 @@ static int fimd_power_on(struct fimd_context *ctx, bool enable) return 0; } +#ifdef CONFIG_OF +static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device *dev) +{ + struct device_node *np = dev->of_node; + struct device_node *disp_np; + struct exynos_drm_fimd_pdata *pd; + u32 data[4]; + + pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); + if (!pd) { + dev_err(dev, "memory allocation for pdata failed\n"); + return ERR_PTR(-ENOMEM); + } + + if (of_get_property(np, "samsung,fimd-vidout-rgb", NULL)) + pd->vidcon0 |= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB; + if (of_get_property(np, "samsung,fimd-inv-hsync", NULL)) + pd->vidcon1 |= VIDCON1_INV_HSYNC; + if (of_get_property(np, "samsung,fimd-inv-vsync", NULL)) + pd->vidcon1 |= VIDCON1_INV_VSYNC; + if (of_get_property(np, "samsung,fimd-inv-vclk", NULL)) + pd->vidcon1 |= VIDCON1_INV_VCLK; + if (of_get_property(np, "samsung,fimd-inv-vden", NULL)) + pd->vidcon1 |= VIDCON1_INV_VDEN; + + disp_np = of_parse_phandle(np, "samsung,fimd-display", 0); + if (!disp_np) { + dev_err(dev, "unable to find display panel info\n"); + return ERR_PTR(-EINVAL); + } + + if (of_property_read_u32_array(disp_np, "lcd-htiming", data, 4)) { + dev_err(dev, "invalid horizontal timing\n"); + return ERR_PTR(-EINVAL); + } + pd->panel.timing.left_margin = data[0]; + pd->panel.timing.right_margin = data[1]; + pd->panel.timing.hsync_len = data[2]; + pd->panel.timing.xres = data[3]; + + if (of_property_read_u32_array(disp_np, "lcd-vtiming", data, 4)) { + dev_err(dev, "invalid vertical timing\n"); + return ERR_PTR(-EINVAL); + } + pd->panel.timing.upper_margin = data[0]; + pd->panel.timing.lower_margin = data[1]; + pd->panel.timing.vsync_len = data[2]; + pd->panel.timing.yres = data[3]; + + of_property_read_u32(np, "samsung,fimd-frame-rate", + &pd->panel.timing.refresh); + + of_property_read_u32(np, "samsung,default-window", &pd->default_win); + + of_property_read_u32(np, "samsung,fimd-win-bpp", &pd->bpp); + + return pd; +} +#else +static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device *dev) +{ + return NULL; +} +#endif /* CONFIG_OF */ + static int __devinit fimd_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct fimd_context *ctx; struct exynos_drm_subdrv *subdrv; - struct exynos_drm_fimd_pdata *pdata; + struct exynos_drm_fimd_pdata *pdata = pdev->dev.platform_data; struct exynos_drm_panel_info *panel; struct resource *res; int win; @@ -822,7 +897,11 @@ static int __devinit fimd_probe(struct platform_device *pdev) DRM_DEBUG_KMS("%s\n", __FILE__); - pdata = pdev->dev.platform_data; + if (pdev->dev.of_node) { + pdata = drm_fimd_dt_parse_pdata(&pdev->dev); + if (IS_ERR(pdata)) + return PTR_ERR(pdata); + } if (!pdata) { dev_err(dev, "no platform data specified\n"); return -EINVAL; @@ -1016,6 +1095,17 @@ static struct platform_device_id fimd_driver_ids[] = { }; MODULE_DEVICE_TABLE(platform, fimd_driver_ids); +#ifdef CONFIG_OF +static const struct of_device_id fimd_dt_match[] = { + { .compatible = "samsung,exynos5-fimd", + .data = &exynos5_fimd_driver_data }, + { .compatible = "samsung,exynos4-fb", + .data = &exynos4_fimd_driver_data }, + {}, +}; +MODULE_DEVICE_TABLE(of, fimd_dt_match); +#endif + static const struct dev_pm_ops fimd_pm_ops = { SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume) SET_RUNTIME_PM_OPS(fimd_runtime_suspend, fimd_runtime_resume, NULL) @@ -1029,5 +1119,6 @@ struct platform_driver fimd_driver = { .name = "exynos-drm-fimd", .owner = THIS_MODULE, .pm = &fimd_pm_ops, + .of_match_table = of_match_ptr(fimd_dt_match), }, };
Add device tree based discovery support for DRM-FIMD driver. Signed-off-by: Leela Krishna Amudala <l.krishna@samsung.com> --- Documentation/devicetree/bindings/fb/drm-fimd.txt | 80 +++++++++++++++++ drivers/gpu/drm/exynos/exynos_drm_fimd.c | 95 ++++++++++++++++++++- 2 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 Documentation/devicetree/bindings/fb/drm-fimd.txt