video: da8xx-fb: am335x DT support
Subsystems (2)
v3 cover video: da8xx-fb: am335x DT support
Hi,
This series adds DT support to da8xx-fb driver (device found on DaVinci and AM335x SoC's). It does certain cleanup's in the process.
This series as compared to previous version handles configuration of the LCDC clock rate by modelling as a clock divider of CCF. This would take effect only if CCF is selected, if not, no change to existing method.
This makes use of Steffen Trumtrar's v16 of display timing DT support.
Testing has been done on AM335x SoC based boards like AM335x EVM. It has also been verified that display on DA850 EVM (non-DT boot) works as earlier.
This series is based on v3.8-rc3,
and is dependent on,
1. Series v16 "of: add display helper" by,
Steffen Trumtrar <[email protected]>
2. Patch "da8xx: Allow use by am33xx based devices" by, Pantelis Antoniou <[email protected]>
3. Series v3 "video: da8xx-fb: runtime timing configuration" by, me (Afzal Mohammed <[email protected]>)
To test this series on AM335x based boards,
1. Series v2 "ARM: dts: AM33XX: lcdc support" by,
me (Afzal Mohammed <[email protected]>),
2. Series "HWMOD fixes for AM33xx PWM submodules and device tree nodes" by, Philip, Avinash <[email protected]>
3. Series "clk: divider: prepare for minimum divider" by,
me (Afzal Mohammed <[email protected]>),
4. Series "ARM: AM335x: LCDC platform support" by,
me (Afzal Mohammed <[email protected]>),
would be needed.
All above dependencies along with those required for testing is available @ git://gitorious.org/x0148406-public/linux-kernel.git tags/da8xx-fb-dt-v3
Regards
Afzal
v3: model CCF clock divider with parent propogation if CCF selected
v2: 2 new patches - one to configure clock rate properly (12/12)and
other to make io operations safe (1/12)
Afzal Mohammed (11):
video: da8xx-fb: make io operations safe
video: da8xx-fb: enable sync lost intr for v2 ip
video: da8xx-fb: use devres
video: da8xx-fb: ensure non-null cfg in pdata
video: da8xx-fb: reorganize panel detection
video: da8xx-fb: minimal dt support
video: da8xx-fb: invoke platform callback safely
video: da8xx-fb: obtain fb_videomode info from dt
video: da8xx-fb: ensure pdata only for non-dt
video: da8xx-fb: setup struct lcd_ctrl_config for dt
video: da8xx-fb: CCF clock divider handling
Manjunathappa, Prakash (1):
video: da8xx-fb: fix 24bpp raster configuration
.../devicetree/bindings/video/fb-da8xx.txt | 37 ++++ drivers/video/da8xx-fb.c | 217 ++++++++++++++++----- 2 files changed, 201 insertions(+), 53 deletions(-) create mode 100644 Documentation/devicetree/bindings/video/fb-da8xx.txt
Signature · 1 line
1.7.12
PATCH v3 1/12 video: da8xx-fb: make io operations safe
Replace __raw_readl/__raw_writel with readl/writel; this driver is reused on ARMv7 (AM335x SoC).
---
v2: new patch
drivers/video/da8xx-fb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/video/da8xx-fb.c +2 -2
@@ -141,12 +141,12 @@ static int frame_done_flag;static inline unsigned int lcdc_read (unsigned int addr) { -return (unsigned int )__raw_readl (da8xx_fb_reg_base + (addr)); +return (unsigned int )readl (da8xx_fb_reg_base + (addr)); }static inline void lcdc_write (unsigned int val,unsigned int addr) { -__raw_writel (val, da8xx_fb_reg_base + (addr)); +writel (val, da8xx_fb_reg_base + (addr)); }struct da8xx_fb_par {
Signature · 1 line
1.7.12
PATCH v3 2/12 video: da8xx-fb: fix 24bpp raster configuration
In reply to Afzal MohammedFrom: "Manjunathappa, Prakash" <[email protected]>
Set only LCD_V2_TFT_24BPP_MODE bit for 24bpp and LCD_V2_TFT_24BPP_UNPACK bit along with LCD_V2_TFT_24BPP_MODE for 32bpp configuration.
Patch is tested on am335x-evm for 24bpp and da850-evm for 16bpp configurations.
--- drivers/video/da8xx-fb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/video/da8xx-fb.c +2 -2
@@ -550,10 +550,10 @@ static int lcd_cfg_frame_buffer(struct da8xx_fb_par *par, u32 width, u32 height,case 4 :case 16 :break ; -case 24 : - reg |=LCD_V2_TFT_24BPP_MODE ;case 32 : reg |=LCD_V2_TFT_24BPP_UNPACK ; +case 24 : + reg |=LCD_V2_TFT_24BPP_MODE ;break ;case 8 :
Signature · 1 line
1.7.12
PATCH v3 3/12 video: da8xx-fb: enable sync lost intr for v2 ip
In reply to Afzal Mohammedinterrupt handler is checking for sync lost interrupt, but it was not enabled, enable it.
--- drivers/video/da8xx-fb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/da8xx-fb.c +1 -1
@@ -318,7 +318,7 @@ static void lcd_blit(int load_mode, struct da8xx_fb_par *par) reg_int =lcdc_read (LCD_INT_ENABLE_SET_REG ) |LCD_V2_END_OF_FRAME0_INT_ENA |LCD_V2_END_OF_FRAME1_INT_ENA | -LCD_FRAME_DONE ; +LCD_FRAME_DONE |LCD_SYNC_LOST ;lcdc_write (reg_int,LCD_INT_ENABLE_SET_REG ); } reg_dma |=LCD_DUAL_FRAME_BUFFER_ENABLE ;
Signature · 1 line
1.7.12
PATCH v3 4/12 video: da8xx-fb: use devres
In reply to Afzal MohammedReplace existing resource handling in the driver with managed device resource.
--- drivers/video/da8xx-fb.c | 35 ++++++----------------------------- 1 file changed, 6 insertions(+), 29 deletions(-)
drivers/video/da8xx-fb.c +6 -29
@@ -1036,12 +1036,9 @@ static int fb_remove(struct platform_device *dev) par->p_palette_base);dma_free_coherent (NULL , par->vram_size, par->vram_virt, par->vram_phys); -free_irq (par->irq, par);pm_runtime_put_sync (&dev->dev);pm_runtime_disable (&dev->dev);framebuffer_release (info); -iounmap (da8xx_fb_reg_base); -release_mem_region (lcdc_regs->start,resource_size (lcdc_regs)); }return 0 ;
@@ -1265,7 +1262,6 @@ static int fb_probe(struct platform_device *device)struct fb_info *da8xx_fb_info;struct clk *fb_clk =NULL ;struct da8xx_fb_par *par; -resource_size_t len;int ret, i;unsigned long ulcm;
@@ -1275,29 +1271,16 @@ static int fb_probe(struct platform_device *device) } lcdc_regs =platform_get_resource (device,IORESOURCE_MEM ,0 ); -if (!lcdc_regs) { -dev_err (&device->dev, -"Can not get memory resource for LCD controller\n" ); -return -ENOENT ; - } - - len =resource_size (lcdc_regs); - - lcdc_regs =request_mem_region (lcdc_regs->start, len, lcdc_regs->name); -if (!lcdc_regs) -return -EBUSY ; - - da8xx_fb_reg_base =ioremap (lcdc_regs->start, len); + da8xx_fb_reg_base =devm_request_and_ioremap (&device->dev, lcdc_regs);if (!da8xx_fb_reg_base) { - ret = -EBUSY ; - goto err_request_mem; +dev_err (&device->dev,"memory resource setup failed\n" ); +return -EADDRNOTAVAIL ; } - fb_clk =clk_get (&device->dev,"fck" ); + fb_clk =devm_clk_get (&device->dev,"fck" );if (IS_ERR (fb_clk)) {dev_err (&device->dev,"Can not get device clock\n" ); - ret = -ENODEV ; - goto err_ioremap; +return -ENODEV ; }pm_runtime_enable (&device->dev);
@@ -1458,7 +1441,7 @@ static int fb_probe(struct platform_device *device) lcdc_irq_handler = lcdc_irq_handler_rev02; } - ret =request_irq (par->irq, lcdc_irq_handler,0 , + ret =devm_request_irq (&device->dev, par->irq, lcdc_irq_handler,0 ,DRIVER_NAME , par);if (ret) goto irq_freq;
@@ -1488,12 +1471,6 @@ err_pm_runtime_disable:pm_runtime_put_sync (&device->dev);pm_runtime_disable (&device->dev); -err_ioremap: -iounmap (da8xx_fb_reg_base); - -err_request_mem: -release_mem_region (lcdc_regs->start, len); -return ret; }
Signature · 1 line
1.7.12
PATCH v3 5/12 video: da8xx-fb: ensure non-null cfg in pdata
In reply to Afzal MohammedEnsure that platform data contains pointer for lcd_ctrl_config.
--- drivers/video/da8xx-fb.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/video/da8xx-fb.c +5 -0
@@ -1320,6 +1320,11 @@ static int fb_probe(struct platform_device *device) lcd_cfg = (struct lcd_ctrl_config *)fb_pdata->controller_data; +if (!lcd_cfg) { + ret = -EINVAL ; + goto err_pm_runtime_disable; + } + da8xx_fb_info =framebuffer_alloc (sizeof (struct da8xx_fb_par ), &device->dev);if (!da8xx_fb_info) {
Signature · 1 line
1.7.12
PATCH v3 6/12 video: da8xx-fb: reorganize panel detection
In reply to Afzal MohammedMove panel detection to a separate function, this helps in readability as well as makes DT support cleaner.
--- drivers/video/da8xx-fb.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-)
drivers/video/da8xx-fb.c +26 -16
@@ -1253,6 +1253,27 @@ static struct fb_ops da8xx_fb_ops = { .fb_blank = cfb_blank, }; +static struct fb_videomode *da8xx_fb_get_videomode (struct platform_device *dev) +{ +struct da8xx_lcdc_platform_data *fb_pdata = dev->dev.platform_data; +struct fb_videomode *lcdc_info; +int i; + +for (i =0 , lcdc_info = known_lcd_panels; + i <ARRAY_SIZE (known_lcd_panels); i++, lcdc_info++) { +if (strcmp (fb_pdata->type, lcdc_info->name) ==0 ) +break ; + } + +if (i ==ARRAY_SIZE (known_lcd_panels)) { +dev_err (&dev->dev,"no panel found\n" ); +return NULL ; + } +dev_info (&dev->dev,"found %s panel\n" , lcdc_info->name); + +return lcdc_info; +} +static int fb_probe (struct platform_device *device) { struct da8xx_lcdc_platform_data *fb_pdata =
@@ -1262,7 +1283,7 @@ static int fb_probe(struct platform_device *device)struct fb_info *da8xx_fb_info;struct clk *fb_clk =NULL ;struct da8xx_fb_par *par; -int ret, i; +int ret;unsigned long ulcm;if (fb_pdata ==NULL ) {
@@ -1270,6 +1291,10 @@ static int fb_probe(struct platform_device *device)return -ENOENT ; } + lcdc_info =da8xx_fb_get_videomode (device); +if (lcdc_info ==NULL ) +return -ENODEV ; + lcdc_regs =platform_get_resource (device,IORESOURCE_MEM ,0 ); da8xx_fb_reg_base =devm_request_and_ioremap (&device->dev, lcdc_regs);if (!da8xx_fb_reg_base) {
@@ -1303,21 +1328,6 @@ static int fb_probe(struct platform_device *device)break ; } -for (i =0 , lcdc_info = known_lcd_panels; - i <ARRAY_SIZE (known_lcd_panels); - i++, lcdc_info++) { -if (strcmp (fb_pdata->type, lcdc_info->name) ==0 ) -break ; - } - -if (i ==ARRAY_SIZE (known_lcd_panels)) { -dev_err (&device->dev,"GLCD: No valid panel found\n" ); - ret = -ENODEV ; - goto err_pm_runtime_disable; - }else -dev_info (&device->dev,"GLCD: Found %s panel\n" , - fb_pdata->type); - lcd_cfg = (struct lcd_ctrl_config *)fb_pdata->controller_data;if (!lcd_cfg) {
Signature · 1 line
1.7.12
PATCH v3 7/12 video: da8xx-fb: minimal dt support
In reply to Afzal MohammedDriver is provided a means to have the probe triggered by DT.
--- Documentation/devicetree/bindings/video/fb-da8xx.txt | 16 ++++++++++++++++ drivers/video/da8xx-fb.c | 7 +++++++ 2 files changed, 23 insertions(+) create mode 100644 Documentation/devicetree/bindings/video/fb-da8xx.txt
Documentation/devicetree/bindings/video/fb-da8xx.txt new file +16 -0
@@ -0,0 +1,16 @@ +TI LCD Controller on DA830/DA850/AM335x SoC's + +Required properties: +- compatible: + DA830 - "ti,da830-lcdc" + AM335x SoC's - "ti,am3352-lcdc", "ti,da830-lcdc" +- reg: Address range of lcdc register set +- interrupts: lcdc interrupt + +Example: + +lcdc@4830e000 { + compatible = "ti,am3352-lcdc", "ti,da830-lcdc"; + reg = <0x4830e000 0x1000>; + interrupts = <36>; +};
drivers/video/da8xx-fb.c +7 -0
@@ -1595,6 +1595,12 @@ static int fb_resume(struct platform_device *dev)#define fb_resume NULL#endif +static const struct of_device_id da8xx_fb_of_match[] = { + {.compatible ="ti,da830-lcdc" , }, + {}, +}; +MODULE_DEVICE_TABLE (of, da8xx_fb_of_match); +static struct platform_driver da8xx_fb_driver = { .probe = fb_probe, .remove = fb_remove,
@@ -1603,6 +1609,7 @@ static struct platform_driver da8xx_fb_driver = { .driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, + .of_match_table = of_match_ptr(da8xx_fb_of_match), }, };
Signature · 1 line
1.7.12
PATCH v3 8/12 video: da8xx-fb: invoke platform callback safely
In reply to Afzal MohammedEnsure that platform data is present before checking whether platform callback is present (the one used to control backlight). So far this was not an issue as driver was purely non-DT triggered, but now DT support has been added.
--- drivers/video/da8xx-fb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/da8xx-fb.c +1 -1
@@ -1347,7 +1347,7 @@ static int fb_probe(struct platform_device *device) par->dev = &device->dev; par->lcdc_clk = fb_clk; par->lcd_fck_rate =clk_get_rate (fb_clk); -if (fb_pdata->panel_power_ctrl) { +if (fb_pdata && fb_pdata->panel_power_ctrl) { par->panel_power_ctrl = fb_pdata->panel_power_ctrl; par->panel_power_ctrl (1 ); }
Signature · 1 line
1.7.12
PATCH v3 9/12 video: da8xx-fb: obtain fb_videomode info from dt
In reply to Afzal MohammedObtain fb_videomode details for the connected lcd panel using the display timing details present in DT.
--- .../devicetree/bindings/video/fb-da8xx.txt | 21 +++++++++++++++++++++ drivers/video/da8xx-fb.c | 17 +++++++++++++++++ 2 files changed, 38 insertions(+)
Documentation/devicetree/bindings/video/fb-da8xx.txt +21 -0
@@ -6,6 +6,12 @@ Required properties: AM335x SoC's - "ti,am3352-lcdc", "ti,da830-lcdc" - reg: Address range of lcdc register set - interrupts: lcdc interrupt +- display-timings: typical videomode of lcd panel, represented as child. + Refer Documentation/devicetree/bindings/video/display-timing.txt for + display timing binding details. If multiple videomodes are mentioned + in display timings node, typical videomode has to be mentioned as the + native mode or it has to be first child (driver cares only for native + videomode). Example:
@@ -13,4 +19,19 @@ lcdc@4830e000 { compatible = "ti,am3352-lcdc", "ti,da830-lcdc"; reg = <0x4830e000 0x1000>; interrupts = <36>; + display-timings { + 800x480p62 { + clock-frequency = <30000000>; + hactive = <800>; + vactive = <480>; + hfront-porch = <39>; + hback-porch = <39>; + hsync-len = <47>; + vback-porch = <29>; + vfront-porch = <13>; + vsync-len = <2>; + hsync-active = <1>; + vsync-active = <1>; + }; + }; };
drivers/video/da8xx-fb.c +17 -0
@@ -36,6 +36,7 @@#include <linux/slab.h> #include <linux/delay.h> #include <linux/lcm.h> +#include <video/of_display_timing.h> #include <video/da8xx-fb.h> #include <asm/div64.h>
@@ -1257,8 +1258,24 @@ static struct fb_videomode *da8xx_fb_get_videomode(struct platform_device *dev) {struct da8xx_lcdc_platform_data *fb_pdata = dev->dev.platform_data;struct fb_videomode *lcdc_info; +struct device_node *np = dev->dev.of_node;int i; +if (np) { + lcdc_info =devm_kzalloc (&dev->dev, +sizeof (struct fb_videomode ), +GFP_KERNEL ); +if (!lcdc_info) { +dev_err (&dev->dev,"memory allocation failed\n" ); +return NULL ; + } +if (of_get_fb_videomode (np, lcdc_info,OF_USE_NATIVE_MODE )) { +dev_err (&dev->dev,"timings not available in DT\n" ); +return NULL ; + } +return lcdc_info; + } +for (i =0 , lcdc_info = known_lcd_panels; i <ARRAY_SIZE (known_lcd_panels); i++, lcdc_info++) {if (strcmp (fb_pdata->type, lcdc_info->name) ==0 )
Signature · 1 line
1.7.12
PATCH v3 10/12 video: da8xx-fb: ensure pdata only for non-dt
In reply to Afzal MohammedThis driver is DT probe-able, hence ensure presence of platform data only for non-DT boot.
--- drivers/video/da8xx-fb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/da8xx-fb.c +1 -1
@@ -1303,7 +1303,7 @@ static int fb_probe(struct platform_device *device)int ret;unsigned long ulcm; -if (fb_pdata ==NULL ) { +if (fb_pdata ==NULL && !device->dev.of_node) {dev_err (&device->dev,"Can not get platform data\n" );return -ENOENT ; }
Signature · 1 line
1.7.12
PATCH v3 11/12 video: da8xx-fb: setup struct lcd_ctrl_config for dt
In reply to Afzal Mohammedstrcut lcd_ctrl_config information required for driver is currently obtained via platform data. To handle DT probing, create lcd_ctrl_config and populate it with default values, these values are sufficient for the panels so far used with this controller to work.
--- drivers/video/da8xx-fb.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-)
drivers/video/da8xx-fb.c +33 -1
@@ -1254,6 +1254,35 @@ static struct fb_ops da8xx_fb_ops = { .fb_blank = cfb_blank, }; +static struct lcd_ctrl_config *da8xx_fb_create_cfg (struct platform_device *dev) +{ +struct lcd_ctrl_config *cfg; + + cfg =devm_kzalloc (&dev->dev,sizeof (struct fb_videomode ),GFP_KERNEL ); +if (!cfg) { +dev_err (&dev->dev,"memory allocation failed\n" ); +return NULL ; + } + +/* default values */ + +if (lcd_revision ==LCD_VERSION_1 ) + cfg->bpp =16 ; +else + cfg->bpp =32 ; + +/* +* For panels so far used with this LCDC, below statement is sufficient. +* For new panels, if required, struct lcd_ctrl_cfg fields to be updated +* with additional/modified values. Those values would have to be then +* obtained from dt(requiring new dt bindings). +*/ + + cfg->panel_shade =COLOR_ACTIVE ; + +return cfg; +} +static struct fb_videomode *da8xx_fb_get_videomode (struct platform_device *dev) {struct da8xx_lcdc_platform_data *fb_pdata = dev->dev.platform_data;
@@ -1345,7 +1374,10 @@ static int fb_probe(struct platform_device *device)break ; } - lcd_cfg = (struct lcd_ctrl_config *)fb_pdata->controller_data; +if (device->dev.of_node) + lcd_cfg =da8xx_fb_create_cfg (device); +else + lcd_cfg = (struct lcd_ctrl_config *)fb_pdata->controller_data;if (!lcd_cfg) { ret = -EINVAL ;
Signature · 1 line
1.7.12
PATCH v3 12/12 video: da8xx-fb: CCF clock divider handling
In reply to Afzal MohammedCommon clock framework provides a basic clock divider. Make use of it to handle clock configuration in the LCDC IP, wherever applicable; out of two platforms having this IP, only am335x is converted to use CCF, DaVinci is not yet converted. Hence wrap the modification such that it will come into effect only if CCF is selected, otherwise, prgram dividers as earlier. Once DaVinci is converted to use CCF, this ifdef'ery can be removed.
Divider clock instantiated is made as a one that allows the rate propogation to it's parent, that provides more options w.r.t pixel clock rates that could be configured.
---
v3: model CCF clock divider with parent propogation if CCF selected
v2: new patch
drivers/video/da8xx-fb.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-)
drivers/video/da8xx-fb.c +65 -2
@@ -36,6 +36,7 @@#include <linux/slab.h> #include <linux/delay.h> #include <linux/lcm.h> +#include <linux/clk-provider.h> #include <video/of_display_timing.h> #include <video/da8xx-fb.h> #include <asm/div64.h>
@@ -133,6 +134,10 @@#define WSI_TIMEOUT 50#define PALETTE_SIZE 256 +#define LCD_CLK_SHIFT 8 +#define LCD_CLK_WIDTH 8 +#define LCD_CLK_MIN_DIV 2 +static void __iomem *da8xx_fb_reg_base;static struct resource *lcdc_regs;static unsigned int lcd_revision;
@@ -181,6 +186,9 @@ struct da8xx_fb_par {u32 pseudo_palette[16 ];struct fb_videomode mode;struct lcd_ctrl_config cfg; +#ifdef CONFIG_COMMON_CLK +struct clk *child_clk; +#endif };static struct fb_var_screeninfo da8xx_fb_var;
@@ -689,6 +697,19 @@ static inline unsigned da8xx_fb_calc_clk_divider(struct da8xx_fb_par *par,return par->lcd_fck_rate / (PICOS2KHZ (pixclock) *1000 ); } +#ifdef CONFIG_COMMON_CLK +static inline unsigned da8xx_fb_round_clk (struct da8xx_fb_par *par, +unsigned pixclock) +{ +unsigned long rate; + + rate =PICOS2KHZ (pixclock) *1000 ; + rate =clk_round_rate (par->child_clk, rate); + rate =KHZ2PICOS (rate /1000 ); + +return rate; +} +#else static inline unsigned da8xx_fb_round_clk (struct da8xx_fb_par *par,unsigned pixclock) {
@@ -697,25 +718,49 @@ static inline unsigned da8xx_fb_round_clk(struct da8xx_fb_par *par, div =da8xx_fb_calc_clk_divider (par, pixclock);return KHZ2PICOS (par->lcd_fck_rate / (1000 * div)); } +#endif static inline void da8xx_fb_config_clk_divider (unsigned div) {/* Configure the LCD clock divisor. */ lcdc_write (LCD_CLK_DIVISOR (div) | (LCD_RASTER_MODE &0x1 ),LCD_CTRL_REG ); +} +static inline void da8xx_fb_clkc_enable (void ) +{if (lcd_revision ==LCD_VERSION_2 )lcdc_write (LCD_V2_DMA_CLK_EN |LCD_V2_LIDD_CLK_EN |LCD_V2_CORE_CLK_EN ,LCD_CLK_ENABLE_REG ); } -static inline void da8xx_fb_calc_config_clk_divider (struct da8xx_fb_par *par, +#ifdef CONFIG_COMMON_CLK +static inline int da8xx_fb_calc_config_clk_divider (struct da8xx_fb_par *par, +struct fb_videomode *mode) +{ +int ret; + + ret =clk_set_rate (par->child_clk,PICOS2KHZ (mode->pixclock) *1000 ); +if (IS_ERR_VALUE (ret)) { +dev_err (par->dev,"unable to setup pixel clock of %u ps" , + mode->pixclock); +return ret; + } +da8xx_fb_clkc_enable (); +return 0 ; +} +#else +static inline int da8xx_fb_calc_config_clk_divider (struct da8xx_fb_par *par,struct fb_videomode *mode) {unsigned div =da8xx_fb_calc_clk_divider (par, mode->pixclock);da8xx_fb_config_clk_divider (div); +da8xx_fb_clkc_enable (); + +return 0 ; } +#endif static int lcd_init (struct da8xx_fb_par *par,const struct lcd_ctrl_config *cfg,struct fb_videomode *panel)
@@ -723,7 +768,9 @@ static int lcd_init(struct da8xx_fb_par *par, const struct lcd_ctrl_config *cfg,u32 bpp;int ret =0 ; -da8xx_fb_calc_config_clk_divider (par, panel); + ret =da8xx_fb_calc_config_clk_divider (par, panel); +if (IS_ERR_VALUE (ret)) +return ret;if (panel->sync &FB_SYNC_CLK_INVERT ) lcdc_write((lcdc_read(LCD_RASTER_TIMING_2_REG) |
@@ -1406,6 +1453,22 @@ static int fb_probe(struct platform_device *device)da8xx_fb_lcd_reset (); +#ifdef CONFIG_COMMON_CLK +lcdc_write (LCD_RASTER_MODE |LCD_CLK_DIVISOR (0x2 ),LCD_CTRL_REG ); + par->child_clk =clk_register_divider (NULL ,"da8xx_fb_clk" , +__clk_get_name (fb_clk), +CLK_SET_RATE_PARENT , + da8xx_fb_reg_base +LCD_CTRL_REG , +LCD_CLK_SHIFT ,LCD_CLK_WIDTH , +LCD_CLK_MIN_DIV , +CLK_DIVIDER_ONE_BASED ,NULL ); +if (IS_ERR (par->child_clk)) { +dev_err (&device->dev,"error registering clk\n" ); + ret = -ENODEV ; + goto err_release_fb; + } +#endif +/* allocate frame buffer */ par->vram_size = lcdc_info->xres * lcdc_info->yres * lcd_cfg->bpp; ulcm =lcm ((lcdc_info->xres * lcd_cfg->bpp)/8 ,PAGE_SIZE );
Signature · 1 line
1.7.12
Op 22 jan. 2013, om 17:51 heeft Afzal Mohammed <[email protected]> het volgende geschreven:
Quoted 11 lines
Hi,
This series adds DT support to da8xx-fb driver (device found on DaVinci and AM335x SoC's). It does certain cleanup's in the process.
This series as compared to previous version handles configuration of the LCDC clock rate by modelling as a clock divider of CCF. This would take effect only if CCF is selected, if not, no change to existing method.
This makes use of Steffen Trumtrar's v16 of display timing DT support.
Wouldn't it be better to delete da8xx-fb.* and switch to Rob Clarks DRM based driver for this IP block?
regards,
Koen
Quoted 8 lines · Koen Kooi
Op 22 jan. 2013, om 17:51 heeft Afzal Mohammed <[email protected]> het volgende geschreven:
Quoted 5 lines
Hi,
This series adds DT support to da8xx-fb driver (device found on DaVinci and AM335x SoC's). It does certain cleanup's in the process.
Quoted 8 lines
Quoted 6 lines
This series as compared to previous version handles configuration of the LCDC clock rate by modelling as a clock divider of CCF. This would take effect only if CCF is selected, if not, no change to existing method.
This makes use of Steffen Trumtrar's v16 of display timing DT support.
Wouldn't it be better to delete da8xx-fb.* and switch to Rob Clarks DRM based driver for this IP block?
we probably can't delete da8xx-fb, but I think it would be ok to only use it for legacy platforms not yet ported to DT.
BR,
-R
Quoted 6 lines
regards,
Koen--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
SGksDQoNCk9uIFdlZCwgSmFuIDIzLCAyMDEzIGF0IDAwOjE1OjA5LCBSb2IgQ2xhcmsgd3JvdGU6 DQoNCj4gPiBXb3VsZG4ndCBpdCBiZSBiZXR0ZXIgdG8gZGVsZXRlIGRhOHh4LWZiLiogYW5kIHN3 aXRjaCB0byBSb2IgQ2xhcmtzIERSTSBiYXNlZCBkcml2ZXIgZm9yIHRoaXMgSVAgYmxvY2s/DQoN Cj4gd2UgcHJvYmFibHkgY2FuJ3QgZGVsZXRlIGRhOHh4LWZiLCBidXQgSSB0aGluayBpdCB3b3Vs ZCBiZSBvayB0byBvbmx5DQo+IHVzZSBpdCBmb3IgbGVnYWN5IHBsYXRmb3JtcyBub3QgeWV0IHBv cnRlZCB0byBEVC4NCg0KV2UgY2FuJ3QgcmVtb3ZlIGRhOHh4LWZiIGFzIERBODMwIGlzIGEgbm9u LURUIG9uZSBhbmQgREE4NTAgaXMgb25seSBnYWluaW5nDQpEVCBzdXBwb3J0Lg0KDQpBbmQgUm9i LA0KDQpJIGFtIG5vdCBmYW1pbGlhciB3aXRoIGRybSBzZXR1cCwgd291bGQgYWxsIHRoZSB1c2Vy IHNwYWNlIGZyYW1lIGJ1ZmZlciBiYXNlZA0KYXBwbGljYXRpb25zIHdvcmsgYXMgaXMgd2l0aCBk cm0gZHJpdmVyPw0KDQpSZWdhcmRzDQpBZnphbA0K
Quoted 9 lines · Afzal
Hi,
Quoted 4 lines · Rob Clark
Quoted 1 line
Wouldn't it be better to delete da8xx-fb.* and switch to Rob Clarks DRM based driver for this IP block?
we probably can't delete da8xx-fb, but I think it would be ok to only use it for legacy platforms not yet ported to DT.
Quoted 7 lines
We can't remove da8xx-fb as DA830 is a non-DT one and DA850 is only gaining DT support.
And Rob,
I am not familiar with drm setup, would all the user space frame buffer based applications work as is with drm driver?
drm does provide a legacy fbdev interface (needed for fbcon, for example). I don't think da8xx-fb has any custom ioctls, so probably what drm provides should be enough.
BR,
-R
Quoted 2 lines
Regards
Afzal