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@xxxxxxxx> For fbdev part: Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@xxxxxxxxxxx> [ 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@xxxxxxxxx> > - */ > -#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@xxxxxxxxx> > + */ > +#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) > {