[PATCH 02/22] ARM: omap1: make omapfb standalone compilable

Bartlomiej Zolnierkiewicz b.zolnierkie at samsung.com
Fri Aug 9 11:32:36 UTC 2019


On 8/8/19 11:22 PM, Arnd Bergmann wrote:
> The omapfb driver is split into platform specific code for omap1, and
> driver code that is also specific to omap1.
> 
> Moving both parts into the driver directory simplifies the structure
> and avoids the dependency on certain omap machine header files.
> 
> The interrupt numbers in particular however must not be referenced
> directly from the driver to allow building in a multiplatform
> configuration, so these have to be passed through resources, is
> done for all other omap drivers.
> 
> Signed-off-by: Arnd Bergmann <arnd at arndb.de>

For fbdev part:

Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie at samsung.com>

[ It seems that adding of static inline for omap_set_dma_priority()
  when ARCH_OMAP=n should be in patch #9 but this is a minor issue. ]

Best regards,
--
Bartlomiej Zolnierkiewicz
Samsung R&D Institute Poland
Samsung Electronics

> ---
>  arch/arm/mach-omap1/Makefile                  |  4 --
>  arch/arm/mach-omap1/fb.c                      | 19 +++++++-
>  arch/arm/mach-omap1/include/mach/lcdc.h       | 44 -------------------
>  drivers/video/fbdev/Makefile                  |  2 +-
>  drivers/video/fbdev/omap/Makefile             |  5 +++
>  .../video/fbdev/omap}/lcd_dma.c               |  4 +-
>  .../video/fbdev/omap}/lcd_dma.h               |  2 -
>  drivers/video/fbdev/omap/lcdc.c               |  8 ++--
>  drivers/video/fbdev/omap/lcdc.h               | 35 +++++++++++++++
>  drivers/video/fbdev/omap/omapfb.h             |  2 +
>  drivers/video/fbdev/omap/omapfb_main.c        | 16 ++++++-
>  drivers/video/fbdev/omap/sossi.c              |  3 +-
>  include/linux/omap-dma.h                      |  7 ++-
>  13 files changed, 90 insertions(+), 61 deletions(-)
>  delete mode 100644 arch/arm/mach-omap1/include/mach/lcdc.h
>  rename {arch/arm/mach-omap1 => drivers/video/fbdev/omap}/lcd_dma.c (99%)
>  rename {arch/arm/mach-omap1/include/mach => drivers/video/fbdev/omap}/lcd_dma.h (98%)
> 
> diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile
> index c757a52d0801..450bbf552b57 100644
> --- a/arch/arm/mach-omap1/Makefile
> +++ b/arch/arm/mach-omap1/Makefile
> @@ -57,7 +57,3 @@ obj-$(CONFIG_ARCH_OMAP730)		+= gpio7xx.o
>  obj-$(CONFIG_ARCH_OMAP850)		+= gpio7xx.o
>  obj-$(CONFIG_ARCH_OMAP15XX)		+= gpio15xx.o
>  obj-$(CONFIG_ARCH_OMAP16XX)		+= gpio16xx.o
> -
> -ifneq ($(CONFIG_FB_OMAP),)
> -obj-y += lcd_dma.o
> -endif
> diff --git a/arch/arm/mach-omap1/fb.c b/arch/arm/mach-omap1/fb.c
> index 0e32a959f254..b093375afc27 100644
> --- a/arch/arm/mach-omap1/fb.c
> +++ b/arch/arm/mach-omap1/fb.c
> @@ -17,9 +17,12 @@
>  #include <linux/io.h>
>  #include <linux/omapfb.h>
>  #include <linux/dma-mapping.h>
> +#include <linux/irq.h>
>  
>  #include <asm/mach/map.h>
>  
> +#include <mach/irqs.h>
> +
>  #if IS_ENABLED(CONFIG_FB_OMAP)
>  
>  static bool omapfb_lcd_configured;
> @@ -27,6 +30,19 @@ static struct omapfb_platform_data omapfb_config;
>  
>  static u64 omap_fb_dma_mask = ~(u32)0;
>  
> +struct resource omap_fb_resources[] = {
> +	{
> +		.name  = "irq",
> +		.start = INT_LCD_CTRL,
> +		.flags = IORESOURCE_IRQ,
> +	},
> +	{
> +		.name  = "irq",
> +		.start = INT_SOSSI_MATCH,
> +		.flags = IORESOURCE_IRQ,
> +	},
> +};
> +
>  static struct platform_device omap_fb_device = {
>  	.name		= "omapfb",
>  	.id		= -1,
> @@ -35,7 +51,8 @@ static struct platform_device omap_fb_device = {
>  		.coherent_dma_mask	= DMA_BIT_MASK(32),
>  		.platform_data		= &omapfb_config,
>  	},
> -	.num_resources = 0,
> +	.num_resources = ARRAY_SIZE(omap_fb_resources),
> +	.resource = omap_fb_resources,
>  };
>  
>  void __init omapfb_set_lcd_config(const struct omap_lcd_config *config)
> diff --git a/arch/arm/mach-omap1/include/mach/lcdc.h b/arch/arm/mach-omap1/include/mach/lcdc.h
> deleted file mode 100644
> index 7152db1f5361..000000000000
> --- a/arch/arm/mach-omap1/include/mach/lcdc.h
> +++ /dev/null
> @@ -1,44 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-or-later */
> -/*
> - * arch/arm/mach-omap1/include/mach/lcdc.h
> - *
> - * Extracted from drivers/video/omap/lcdc.c
> - * Copyright (C) 2004 Nokia Corporation
> - * Author: Imre Deak <imre.deak at nokia.com>
> - */
> -#ifndef __MACH_LCDC_H__
> -#define __MACH_LCDC_H__
> -
> -#define OMAP_LCDC_BASE			0xfffec000
> -#define OMAP_LCDC_SIZE			256
> -#define OMAP_LCDC_IRQ			INT_LCD_CTRL
> -
> -#define OMAP_LCDC_CONTROL		(OMAP_LCDC_BASE + 0x00)
> -#define OMAP_LCDC_TIMING0		(OMAP_LCDC_BASE + 0x04)
> -#define OMAP_LCDC_TIMING1		(OMAP_LCDC_BASE + 0x08)
> -#define OMAP_LCDC_TIMING2		(OMAP_LCDC_BASE + 0x0c)
> -#define OMAP_LCDC_STATUS		(OMAP_LCDC_BASE + 0x10)
> -#define OMAP_LCDC_SUBPANEL		(OMAP_LCDC_BASE + 0x14)
> -#define OMAP_LCDC_LINE_INT		(OMAP_LCDC_BASE + 0x18)
> -#define OMAP_LCDC_DISPLAY_STATUS	(OMAP_LCDC_BASE + 0x1c)
> -
> -#define OMAP_LCDC_STAT_DONE		(1 << 0)
> -#define OMAP_LCDC_STAT_VSYNC		(1 << 1)
> -#define OMAP_LCDC_STAT_SYNC_LOST	(1 << 2)
> -#define OMAP_LCDC_STAT_ABC		(1 << 3)
> -#define OMAP_LCDC_STAT_LINE_INT		(1 << 4)
> -#define OMAP_LCDC_STAT_FUF		(1 << 5)
> -#define OMAP_LCDC_STAT_LOADED_PALETTE	(1 << 6)
> -
> -#define OMAP_LCDC_CTRL_LCD_EN		(1 << 0)
> -#define OMAP_LCDC_CTRL_LCD_TFT		(1 << 7)
> -#define OMAP_LCDC_CTRL_LINE_IRQ_CLR_SEL	(1 << 10)
> -
> -#define OMAP_LCDC_IRQ_VSYNC		(1 << 2)
> -#define OMAP_LCDC_IRQ_DONE		(1 << 3)
> -#define OMAP_LCDC_IRQ_LOADED_PALETTE	(1 << 4)
> -#define OMAP_LCDC_IRQ_LINE_NIRQ		(1 << 5)
> -#define OMAP_LCDC_IRQ_LINE		(1 << 6)
> -#define OMAP_LCDC_IRQ_MASK		(((1 << 5) - 1) << 2)
> -
> -#endif /* __MACH_LCDC_H__ */
> diff --git a/drivers/video/fbdev/Makefile b/drivers/video/fbdev/Makefile
> index aab7155884ea..3324301e4c36 100644
> --- a/drivers/video/fbdev/Makefile
> +++ b/drivers/video/fbdev/Makefile
> @@ -111,7 +111,7 @@ obj-$(CONFIG_FB_UDL)		  += udlfb.o
>  obj-$(CONFIG_FB_SMSCUFX)	  += smscufx.o
>  obj-$(CONFIG_FB_XILINX)           += xilinxfb.o
>  obj-$(CONFIG_FB_SH_MOBILE_LCDC)	  += sh_mobile_lcdcfb.o
> -obj-$(CONFIG_FB_OMAP)             += omap/
> +obj-y				  += omap/
>  obj-y                             += omap2/
>  obj-$(CONFIG_XEN_FBDEV_FRONTEND)  += xen-fbfront.o
>  obj-$(CONFIG_FB_CARMINE)          += carminefb.o
> diff --git a/drivers/video/fbdev/omap/Makefile b/drivers/video/fbdev/omap/Makefile
> index daaa73a94e7f..b88e02f5cb1f 100644
> --- a/drivers/video/fbdev/omap/Makefile
> +++ b/drivers/video/fbdev/omap/Makefile
> @@ -5,6 +5,11 @@
>  
>  obj-$(CONFIG_FB_OMAP) += omapfb.o
>  
> +ifdef CONFIG_FB_OMAP
> +# must be built-in
> +obj-y += lcd_dma.o
> +endif
> +
>  objs-yy := omapfb_main.o lcdc.o
>  
>  objs-y$(CONFIG_FB_OMAP_LCDC_EXTERNAL) += sossi.o
> diff --git a/arch/arm/mach-omap1/lcd_dma.c b/drivers/video/fbdev/omap/lcd_dma.c
> similarity index 99%
> rename from arch/arm/mach-omap1/lcd_dma.c
> rename to drivers/video/fbdev/omap/lcd_dma.c
> index a72ac0c02b4f..867a63c06f42 100644
> --- a/arch/arm/mach-omap1/lcd_dma.c
> +++ b/drivers/video/fbdev/omap/lcd_dma.c
> @@ -26,7 +26,9 @@
>  #include <linux/omap-dma.h>
>  
>  #include <mach/hardware.h>
> -#include <mach/lcdc.h>
> +
> +#include "lcdc.h"
> +#include "lcd_dma.h"
>  
>  int omap_lcd_dma_running(void)
>  {
> diff --git a/arch/arm/mach-omap1/include/mach/lcd_dma.h b/drivers/video/fbdev/omap/lcd_dma.h
> similarity index 98%
> rename from arch/arm/mach-omap1/include/mach/lcd_dma.h
> rename to drivers/video/fbdev/omap/lcd_dma.h
> index 1a3c0cf17899..1b4780197381 100644
> --- a/arch/arm/mach-omap1/include/mach/lcd_dma.h
> +++ b/drivers/video/fbdev/omap/lcd_dma.h
> @@ -60,6 +60,4 @@ extern void omap_set_lcd_dma_b1_vxres(unsigned long vxres);
>  extern void omap_set_lcd_dma_b1_mirror(int mirror);
>  extern void omap_set_lcd_dma_b1_scale(unsigned int xscale, unsigned int yscale);
>  
> -extern int omap_lcd_dma_running(void);
> -
>  #endif /* __MACH_OMAP1_LCD_DMA_H__ */
> diff --git a/drivers/video/fbdev/omap/lcdc.c b/drivers/video/fbdev/omap/lcdc.c
> index fa73acfc1371..65953b7fbdb9 100644
> --- a/drivers/video/fbdev/omap/lcdc.c
> +++ b/drivers/video/fbdev/omap/lcdc.c
> @@ -17,7 +17,6 @@
>  #include <linux/clk.h>
>  #include <linux/gfp.h>
>  
> -#include <mach/lcdc.h>
>  #include <linux/omap-dma.h>
>  
>  #include <asm/mach-types.h>
> @@ -25,6 +24,7 @@
>  #include "omapfb.h"
>  
>  #include "lcdc.h"
> +#include "lcd_dma.h"
>  
>  #define MODULE_NAME			"lcdc"
>  
> @@ -713,7 +713,7 @@ static int omap_lcdc_init(struct omapfb_device *fbdev, int ext_mode,
>  	}
>  	clk_enable(lcdc.lcd_ck);
>  
> -	r = request_irq(OMAP_LCDC_IRQ, lcdc_irq_handler, 0, MODULE_NAME, fbdev);
> +	r = request_irq(fbdev->int_irq, lcdc_irq_handler, 0, MODULE_NAME, fbdev);
>  	if (r) {
>  		dev_err(fbdev->dev, "unable to get IRQ\n");
>  		goto fail2;
> @@ -744,7 +744,7 @@ static int omap_lcdc_init(struct omapfb_device *fbdev, int ext_mode,
>  fail4:
>  	omap_free_lcd_dma();
>  fail3:
> -	free_irq(OMAP_LCDC_IRQ, lcdc.fbdev);
> +	free_irq(fbdev->int_irq, lcdc.fbdev);
>  fail2:
>  	clk_disable(lcdc.lcd_ck);
>  fail1:
> @@ -759,7 +759,7 @@ static void omap_lcdc_cleanup(void)
>  		free_palette_ram();
>  	free_fbmem();
>  	omap_free_lcd_dma();
> -	free_irq(OMAP_LCDC_IRQ, lcdc.fbdev);
> +	free_irq(lcdc.fbdev->int_irq, lcdc.fbdev);
>  	clk_disable(lcdc.lcd_ck);
>  	clk_put(lcdc.lcd_ck);
>  }
> diff --git a/drivers/video/fbdev/omap/lcdc.h b/drivers/video/fbdev/omap/lcdc.h
> index 8a7607d861c1..cbbfd9b9e949 100644
> --- a/drivers/video/fbdev/omap/lcdc.h
> +++ b/drivers/video/fbdev/omap/lcdc.h
> @@ -1,6 +1,41 @@
>  /* SPDX-License-Identifier: GPL-2.0 */
>  #ifndef LCDC_H
>  #define LCDC_H
> +/*
> + * Copyright (C) 2004 Nokia Corporation
> + * Author: Imre Deak <imre.deak at nokia.com>
> + */
> +#define OMAP_LCDC_BASE			0xfffec000
> +#define OMAP_LCDC_SIZE			256
> +#define OMAP_LCDC_IRQ			INT_LCD_CTRL
> +
> +#define OMAP_LCDC_CONTROL		(OMAP_LCDC_BASE + 0x00)
> +#define OMAP_LCDC_TIMING0		(OMAP_LCDC_BASE + 0x04)
> +#define OMAP_LCDC_TIMING1		(OMAP_LCDC_BASE + 0x08)
> +#define OMAP_LCDC_TIMING2		(OMAP_LCDC_BASE + 0x0c)
> +#define OMAP_LCDC_STATUS		(OMAP_LCDC_BASE + 0x10)
> +#define OMAP_LCDC_SUBPANEL		(OMAP_LCDC_BASE + 0x14)
> +#define OMAP_LCDC_LINE_INT		(OMAP_LCDC_BASE + 0x18)
> +#define OMAP_LCDC_DISPLAY_STATUS	(OMAP_LCDC_BASE + 0x1c)
> +
> +#define OMAP_LCDC_STAT_DONE		(1 << 0)
> +#define OMAP_LCDC_STAT_VSYNC		(1 << 1)
> +#define OMAP_LCDC_STAT_SYNC_LOST	(1 << 2)
> +#define OMAP_LCDC_STAT_ABC		(1 << 3)
> +#define OMAP_LCDC_STAT_LINE_INT		(1 << 4)
> +#define OMAP_LCDC_STAT_FUF		(1 << 5)
> +#define OMAP_LCDC_STAT_LOADED_PALETTE	(1 << 6)
> +
> +#define OMAP_LCDC_CTRL_LCD_EN		(1 << 0)
> +#define OMAP_LCDC_CTRL_LCD_TFT		(1 << 7)
> +#define OMAP_LCDC_CTRL_LINE_IRQ_CLR_SEL	(1 << 10)
> +
> +#define OMAP_LCDC_IRQ_VSYNC		(1 << 2)
> +#define OMAP_LCDC_IRQ_DONE		(1 << 3)
> +#define OMAP_LCDC_IRQ_LOADED_PALETTE	(1 << 4)
> +#define OMAP_LCDC_IRQ_LINE_NIRQ		(1 << 5)
> +#define OMAP_LCDC_IRQ_LINE		(1 << 6)
> +#define OMAP_LCDC_IRQ_MASK		(((1 << 5) - 1) << 2)
>  
>  int omap_lcdc_set_dma_callback(void (*callback)(void *data), void *data);
>  void omap_lcdc_free_dma_callback(void);
> diff --git a/drivers/video/fbdev/omap/omapfb.h b/drivers/video/fbdev/omap/omapfb.h
> index d930152c289c..313a051fe7a4 100644
> --- a/drivers/video/fbdev/omap/omapfb.h
> +++ b/drivers/video/fbdev/omap/omapfb.h
> @@ -204,6 +204,8 @@ struct omapfb_device {
>  	struct lcd_panel	*panel;			/* LCD panel */
>  	const struct lcd_ctrl	*ctrl;			/* LCD controller */
>  	const struct lcd_ctrl	*int_ctrl;		/* internal LCD ctrl */
> +	int			ext_irq;
> +	int			int_irq;
>  	struct lcd_ctrl_extif	*ext_if;		/* LCD ctrl external
>  							   interface */
>  	struct device		*dev;
> diff --git a/drivers/video/fbdev/omap/omapfb_main.c b/drivers/video/fbdev/omap/omapfb_main.c
> index 90eca64e3144..dc06057de91d 100644
> --- a/drivers/video/fbdev/omap/omapfb_main.c
> +++ b/drivers/video/fbdev/omap/omapfb_main.c
> @@ -1618,7 +1618,7 @@ static int omapfb_do_probe(struct platform_device *pdev,
>  
>  	init_state = 0;
>  
> -	if (pdev->num_resources != 0) {
> +	if (pdev->num_resources != 1) {
>  		dev_err(&pdev->dev, "probed for an unknown device\n");
>  		r = -ENODEV;
>  		goto cleanup;
> @@ -1637,6 +1637,20 @@ static int omapfb_do_probe(struct platform_device *pdev,
>  		r = -ENOMEM;
>  		goto cleanup;
>  	}
> +	fbdev->int_irq = platform_get_irq(pdev, 0);
> +	if (!fbdev->int_irq) {
> +		dev_err(&pdev->dev, "unable to get irq\n");
> +		r = ENXIO;
> +		goto cleanup;
> +	}
> +
> +	fbdev->ext_irq = platform_get_irq(pdev, 1);
> +	if (!fbdev->ext_irq) {
> +		dev_err(&pdev->dev, "unable to get irq\n");
> +		r = ENXIO;
> +		goto cleanup;
> +	}
> +
>  	init_state++;
>  
>  	fbdev->dev = &pdev->dev;
> diff --git a/drivers/video/fbdev/omap/sossi.c b/drivers/video/fbdev/omap/sossi.c
> index 80ac67f27f0d..ade9d452254c 100644
> --- a/drivers/video/fbdev/omap/sossi.c
> +++ b/drivers/video/fbdev/omap/sossi.c
> @@ -15,6 +15,7 @@
>  #include <linux/omap-dma.h>
>  
>  #include "omapfb.h"
> +#include "lcd_dma.h"
>  #include "lcdc.h"
>  
>  #define MODULE_NAME		"omapfb-sossi"
> @@ -638,7 +639,7 @@ static int sossi_init(struct omapfb_device *fbdev)
>  	l &= ~(1 << 31); /* REORDERING */
>  	sossi_write_reg(SOSSI_INIT1_REG, l);
>  
> -	if ((r = request_irq(INT_1610_SoSSI_MATCH, sossi_match_irq,
> +	if ((r = request_irq(fbdev->ext_irq, sossi_match_irq,
>  			     IRQ_TYPE_EDGE_FALLING,
>  	     "sossi_match", sossi.fbdev->dev)) < 0) {
>  		dev_err(sossi.fbdev->dev, "can't get SoSSI match IRQ\n");
> diff --git a/include/linux/omap-dma.h b/include/linux/omap-dma.h
> index ba3cfbb52312..e9d76ac6321d 100644
> --- a/include/linux/omap-dma.h
> +++ b/include/linux/omap-dma.h
> @@ -346,8 +346,8 @@ extern void omap_dma_set_global_params(int arb_rate, int max_fifo_depth,
>  void omap_dma_global_context_save(void);
>  void omap_dma_global_context_restore(void);
>  
> -#if defined(CONFIG_ARCH_OMAP1) && IS_ENABLED(CONFIG_FB_OMAP)
> -#include <mach/lcd_dma.h>
> +#if IS_ENABLED(CONFIG_FB_OMAP)
> +extern int omap_lcd_dma_running(void);
>  #else
>  static inline int omap_lcd_dma_running(void)
>  {
> @@ -356,6 +356,9 @@ static inline int omap_lcd_dma_running(void)
>  #endif
>  
>  #else /* CONFIG_ARCH_OMAP */
> +static inline void omap_set_dma_priority(int lch, int dst_port, int priority)
> +{
> +}
>  
>  static inline struct omap_system_dma_plat_info *omap_get_plat_info(void)
>  {


More information about the dri-devel mailing list