From 6ee30e0b97801fb4a8dac9e9c4a1888e6f00514b Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Mon, 30 May 2011 17:04:35 +0200 Subject: [PATCH 086/107] WIP: add clut resource MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Warning: will currently break old AT91-boards! Signed-off-by: Wolfram Sang Signed-off-by: Uwe Kleine-König --- drivers/video/atmel_hlcdfb.c | 2 -- drivers/video/atmel_lcdfb.c | 1 - drivers/video/atmel_lcdfb_core.c | 35 ++++++++++++++++++++++++++--------- include/video/atmel_lcdfb.h | 2 +- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/drivers/video/atmel_hlcdfb.c b/drivers/video/atmel_hlcdfb.c index b772841..346bb80 100644 --- a/drivers/video/atmel_hlcdfb.c +++ b/drivers/video/atmel_hlcdfb.c @@ -454,7 +454,6 @@ static struct atmel_lcdfb_devdata dev_data_base = { .init_contrast = atmel_hlcdfb_init_contrast, .limit_screeninfo = atmelfb_limit_screeninfo, .fbinfo_flags = ATMEL_LCDFB_FBINFO_DEFAULT, - .lut_base = ATMEL_HLCDC_LUT, .dma_desc_size = sizeof(struct atmel_hlcd_dma_desc), }; @@ -463,7 +462,6 @@ static struct atmel_lcdfb_devdata dev_data_ovl = { .update_dma = atmel_hlcdfb_update_dma_ovl, .limit_screeninfo = atmelfb_limit_screeninfo, .fbinfo_flags = ATMEL_LCDFB_FBINFO_DEFAULT, - .lut_base = 0x800, //FIXME: add define .dma_desc_size = sizeof(struct atmel_hlcd_dma_desc), }; diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index 8d7992c..402cb24 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c @@ -399,7 +399,6 @@ static struct atmel_lcdfb_devdata dev_data = { .init_contrast = atmel_lcdfb_init_contrast, .limit_screeninfo = atmelfb_limit_screeninfo, .fbinfo_flags = ATMEL_LCDFB_FBINFO_DEFAULT, - .lut_base = ATMEL_LCDC_LUT, }; static int __init atmel_lcdfb_probe(struct platform_device *pdev) diff --git a/drivers/video/atmel_lcdfb_core.c b/drivers/video/atmel_lcdfb_core.c index cd57361..89d974a 100644 --- a/drivers/video/atmel_lcdfb_core.c +++ b/drivers/video/atmel_lcdfb_core.c @@ -426,9 +426,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red, * TODO: intensity bit. Maybe something like * ~(red[10] ^ green[10] ^ blue[10]) & 1 */ - - lcdc_writel(sinfo, sinfo->dev_data->lut_base + regno * 4, - val); + writel(val, sinfo->clut + regno * 4); ret = 0; } break; @@ -436,8 +434,7 @@ static int atmel_lcdfb_setcolreg(unsigned int regno, unsigned int red, case FB_VISUAL_MONO01: if (regno < 2) { val = (regno == 0) ? 0x00 : 0x1F; - lcdc_writel(sinfo, sinfo->dev_data->lut_base + regno * 4, - val); + writel(val, sinfo->clut + regno * 4); ret = 0; } break; @@ -553,7 +550,7 @@ int __atmel_lcdfb_probe(struct platform_device *pdev, struct atmel_lcdfb_info *sinfo; struct atmel_lcdfb_info *pdata_sinfo; struct fb_videomode fbmode; - struct resource *regs = NULL; + struct resource *regs = NULL, *clut = NULL; struct resource *map = NULL; int ret; @@ -628,11 +625,19 @@ int __atmel_lcdfb_probe(struct platform_device *pdev, goto stop_clk; } + clut = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (!clut) { + dev_err(dev, "clut resources unusable\n"); + ret = -ENXIO; + goto stop_clk; + } + /* No error checking, some devices can do without IRQ */ sinfo->irq_base = platform_get_irq(pdev, 0); /* Initialize video memory */ - map = platform_get_resource(pdev, IORESOURCE_MEM, 1); + //FIXME: Fix LUTs for old platforms + map = platform_get_resource(pdev, IORESOURCE_MEM, 2); if (map) { /* use a pre-allocated memory buffer */ info->fix.smem_start = map->start; @@ -676,6 +681,17 @@ int __atmel_lcdfb_probe(struct platform_device *pdev, goto release_mem; } + //FIXME: proper request_region and cleanup + if (!request_mem_region(clut->start, resource_size(clut), pdev->name)) { + ret = -EBUSY; + goto unmap_mmio; + } + sinfo->clut = ioremap(clut->start, resource_size(clut)); + if (!sinfo->clut) { + dev_err(dev, "cannot map CLUT\n"); + goto unmap_mmio; + } + /* Initialize PWM for contrast or backlight ("off") */ if (sinfo->dev_data->init_contrast) sinfo->dev_data->init_contrast(sinfo); @@ -688,7 +704,7 @@ int __atmel_lcdfb_probe(struct platform_device *pdev, IRQF_SHARED, pdev->name, info); if (ret) { dev_err(dev, "request_irq failed: %d\n", ret); - goto unmap_mmio; + goto clear_backlight; } } @@ -746,8 +762,9 @@ unregister_irqs: cancel_work_sync(&sinfo->task); if (sinfo->irq_base >= 0) free_irq(sinfo->irq_base, info); -unmap_mmio: +clear_backlight: exit_backlight(sinfo); +unmap_mmio: iounmap(sinfo->mmio); release_mem: release_mem_region(info->fix.mmio_start, info->fix.mmio_len); diff --git a/include/video/atmel_lcdfb.h b/include/video/atmel_lcdfb.h index 3a0dfc7..a9563b8 100644 --- a/include/video/atmel_lcdfb.h +++ b/include/video/atmel_lcdfb.h @@ -48,7 +48,6 @@ struct atmel_lcdfb_devdata { void (*limit_screeninfo)(struct fb_var_screeninfo *var); const struct backlight_ops *bl_ops; int fbinfo_flags; - u32 lut_base; int dma_desc_size; }; @@ -63,6 +62,7 @@ struct atmel_lcdfb_info { spinlock_t lock; struct fb_info *info; void __iomem *mmio; + void __iomem *clut; int irq_base; struct atmel_lcdfb_devdata *dev_data; struct work_struct task; -- 1.7.5.4