Message ID | 1347860103-4141-29-git-send-email-shawn.guo@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, 17 Sep 2012, Shawn Guo wrote: > It changes the driver to use platform_device_id rather than cpu_is_xxx > to determine the controller type, and updates the platform code > accordingly. > > As the result, mach/hardware.h inclusion gets removed from the driver. > > Signed-off-by: Shawn Guo <shawn.guo@linaro.org> > Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de> > Cc: linux-media@vger.kernel.org Acked-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Thanks Guennadi > --- > arch/arm/mach-imx/clk-imx25.c | 6 +- > arch/arm/mach-imx/clk-imx27.c | 6 +- > arch/arm/mach-imx/devices/devices-common.h | 1 + > arch/arm/mach-imx/devices/platform-mx2-camera.c | 12 +-- > drivers/media/video/mx2_camera.c | 95 +++++++++++++++++------ > 5 files changed, 85 insertions(+), 35 deletions(-) > > diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c > index 1aea073..71fe521 100644 > --- a/arch/arm/mach-imx/clk-imx25.c > +++ b/arch/arm/mach-imx/clk-imx25.c > @@ -231,9 +231,9 @@ int __init mx25_clocks_init(void) > clk_register_clkdev(clk[esdhc2_ipg_per], "per", "sdhci-esdhc-imx25.1"); > clk_register_clkdev(clk[esdhc2_ipg], "ipg", "sdhci-esdhc-imx25.1"); > clk_register_clkdev(clk[esdhc2_ahb], "ahb", "sdhci-esdhc-imx25.1"); > - clk_register_clkdev(clk[csi_ipg_per], "per", "mx2-camera.0"); > - clk_register_clkdev(clk[csi_ipg], "ipg", "mx2-camera.0"); > - clk_register_clkdev(clk[csi_ahb], "ahb", "mx2-camera.0"); > + clk_register_clkdev(clk[csi_ipg_per], "per", "imx25-camera.0"); > + clk_register_clkdev(clk[csi_ipg], "ipg", "imx25-camera.0"); > + clk_register_clkdev(clk[csi_ahb], "ahb", "imx25-camera.0"); > clk_register_clkdev(clk[dummy], "audmux", NULL); > clk_register_clkdev(clk[can1_ipg], NULL, "flexcan.0"); > clk_register_clkdev(clk[can2_ipg], NULL, "flexcan.1"); > diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c > index 5ff5cf0..e26de52 100644 > --- a/arch/arm/mach-imx/clk-imx27.c > +++ b/arch/arm/mach-imx/clk-imx27.c > @@ -224,7 +224,7 @@ int __init mx27_clocks_init(unsigned long fref) > clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0"); > clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); > clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0"); > - clk_register_clkdev(clk[csi_ahb_gate], "ahb", "mx2-camera.0"); > + clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0"); > clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); > clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); > clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc"); > @@ -251,8 +251,8 @@ int __init mx27_clocks_init(unsigned long fref) > clk_register_clkdev(clk[i2c2_ipg_gate], NULL, "imx21-i2c.1"); > clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0"); > clk_register_clkdev(clk[kpp_ipg_gate], NULL, "imx-keypad"); > - clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "mx2-camera.0"); > - clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "mx2-camera.0"); > + clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "imx27-camera.0"); > + clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "imx27-camera.0"); > clk_register_clkdev(clk[emma_ahb_gate], "ahb", "m2m-emmaprp.0"); > clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0"); > clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL); > diff --git a/arch/arm/mach-imx/devices/devices-common.h b/arch/arm/mach-imx/devices/devices-common.h > index 7f2698c..8112a1a 100644 > --- a/arch/arm/mach-imx/devices/devices-common.h > +++ b/arch/arm/mach-imx/devices/devices-common.h > @@ -202,6 +202,7 @@ struct platform_device *__init imx_add_mx3_sdc_fb( > > #include <linux/platform_data/camera-mx2.h> > struct imx_mx2_camera_data { > + const char *devid; > resource_size_t iobasecsi; > resource_size_t iosizecsi; > resource_size_t irqcsi; > diff --git a/arch/arm/mach-imx/devices/platform-mx2-camera.c b/arch/arm/mach-imx/devices/platform-mx2-camera.c > index 9ad5b2d..b88877d 100644 > --- a/arch/arm/mach-imx/devices/platform-mx2-camera.c > +++ b/arch/arm/mach-imx/devices/platform-mx2-camera.c > @@ -9,14 +9,16 @@ > #include <mach/hardware.h> > #include "devices-common.h" > > -#define imx_mx2_camera_data_entry_single(soc) \ > +#define imx_mx2_camera_data_entry_single(soc, _devid) \ > { \ > + .devid = _devid, \ > .iobasecsi = soc ## _CSI_BASE_ADDR, \ > .iosizecsi = SZ_4K, \ > .irqcsi = soc ## _INT_CSI, \ > } > -#define imx_mx2_camera_data_entry_single_emma(soc) \ > +#define imx_mx2_camera_data_entry_single_emma(soc, _devid) \ > { \ > + .devid = _devid, \ > .iobasecsi = soc ## _CSI_BASE_ADDR, \ > .iosizecsi = SZ_32, \ > .irqcsi = soc ## _INT_CSI, \ > @@ -27,12 +29,12 @@ > > #ifdef CONFIG_SOC_IMX25 > const struct imx_mx2_camera_data imx25_mx2_camera_data __initconst = > - imx_mx2_camera_data_entry_single(MX25); > + imx_mx2_camera_data_entry_single(MX25, "imx25-camera"); > #endif /* ifdef CONFIG_SOC_IMX25 */ > > #ifdef CONFIG_SOC_IMX27 > const struct imx_mx2_camera_data imx27_mx2_camera_data __initconst = > - imx_mx2_camera_data_entry_single_emma(MX27); > + imx_mx2_camera_data_entry_single_emma(MX27, "imx27-camera"); > #endif /* ifdef CONFIG_SOC_IMX27 */ > > struct platform_device *__init imx_add_mx2_camera( > @@ -58,7 +60,7 @@ struct platform_device *__init imx_add_mx2_camera( > .flags = IORESOURCE_IRQ, > }, > }; > - return imx_add_platform_device_dmamask("mx2-camera", 0, > + return imx_add_platform_device_dmamask(data->devid, 0, > res, data->iobaseemmaprp ? 4 : 2, > pdata, sizeof(*pdata), DMA_BIT_MASK(32)); > } > diff --git a/drivers/media/video/mx2_camera.c b/drivers/media/video/mx2_camera.c > index fe4c76c..cde3374 100644 > --- a/drivers/media/video/mx2_camera.c > +++ b/drivers/media/video/mx2_camera.c > @@ -41,7 +41,6 @@ > #include <linux/videodev2.h> > > #include <linux/platform_data/camera-mx2.h> > -#include <mach/hardware.h> > > #include <asm/dma.h> > > @@ -121,11 +120,13 @@ > > #define CSICR1 0x00 > #define CSICR2 0x04 > -#define CSISR (cpu_is_mx27() ? 0x08 : 0x18) > +#define CSISR_IMX25 0x18 > +#define CSISR_IMX27 0x08 > #define CSISTATFIFO 0x0c > #define CSIRFIFO 0x10 > #define CSIRXCNT 0x14 > -#define CSICR3 (cpu_is_mx27() ? 0x1C : 0x08) > +#define CSICR3_IMX25 0x08 > +#define CSICR3_IMX27 0x1c > #define CSIDMASA_STATFIFO 0x20 > #define CSIDMATA_STATFIFO 0x24 > #define CSIDMASA_FB1 0x28 > @@ -268,6 +269,11 @@ struct mx2_buffer { > struct mx2_buf_internal internal; > }; > > +enum mx2_camera_type { > + IMX25_CAMERA, > + IMX27_CAMERA, > +}; > + > struct mx2_camera_dev { > struct device *dev; > struct soc_camera_host soc_host; > @@ -291,6 +297,9 @@ struct mx2_camera_dev { > struct mx2_buffer *fb2_active; > > u32 csicr1; > + u32 reg_csisr; > + u32 reg_csicr3; > + enum mx2_camera_type devtype; > > struct mx2_buf_internal buf_discard[2]; > void *discard_buffer; > @@ -303,6 +312,29 @@ struct mx2_camera_dev { > struct vb2_alloc_ctx *alloc_ctx; > }; > > +static struct platform_device_id mx2_camera_devtype[] = { > + { > + .name = "imx25-camera", > + .driver_data = IMX25_CAMERA, > + }, { > + .name = "imx27-camera", > + .driver_data = IMX27_CAMERA, > + }, { > + /* sentinel */ > + } > +}; > +MODULE_DEVICE_TABLE(platform, mx2_camera_devtype); > + > +static inline int is_imx25_camera(struct mx2_camera_dev *pcdev) > +{ > + return pcdev->devtype == IMX25_CAMERA; > +} > + > +static inline int is_imx27_camera(struct mx2_camera_dev *pcdev) > +{ > + return pcdev->devtype == IMX27_CAMERA; > +} > + > static struct mx2_buffer *mx2_ibuf_to_buf(struct mx2_buf_internal *int_buf) > { > return container_of(int_buf, struct mx2_buffer, internal); > @@ -406,9 +438,9 @@ static void mx2_camera_deactivate(struct mx2_camera_dev *pcdev) > > clk_disable_unprepare(pcdev->clk_csi); > writel(0, pcdev->base_csi + CSICR1); > - if (cpu_is_mx27()) { > + if (is_imx27_camera(pcdev)) { > writel(0, pcdev->base_emma + PRP_CNTL); > - } else if (cpu_is_mx25()) { > + } else if (is_imx25_camera(pcdev)) { > spin_lock_irqsave(&pcdev->lock, flags); > pcdev->fb1_active = NULL; > pcdev->fb2_active = NULL; > @@ -438,7 +470,7 @@ static int mx2_camera_add_device(struct soc_camera_device *icd) > > csicr1 = CSICR1_MCLKEN; > > - if (cpu_is_mx27()) > + if (is_imx27_camera(pcdev)) > csicr1 |= CSICR1_PRP_IF_EN | CSICR1_FCC | > CSICR1_RXFF_LEVEL(0); > > @@ -514,7 +546,7 @@ out: > static irqreturn_t mx25_camera_irq(int irq_csi, void *data) > { > struct mx2_camera_dev *pcdev = data; > - u32 status = readl(pcdev->base_csi + CSISR); > + u32 status = readl(pcdev->base_csi + pcdev->reg_csisr); > > if (status & CSISR_DMA_TSF_FB1_INT) > mx25_camera_frame_done(pcdev, 1, MX2_STATE_DONE); > @@ -523,7 +555,7 @@ static irqreturn_t mx25_camera_irq(int irq_csi, void *data) > > /* FIXME: handle CSISR_RFF_OR_INT */ > > - writel(status, pcdev->base_csi + CSISR); > + writel(status, pcdev->base_csi + pcdev->reg_csisr); > > return IRQ_HANDLED; > } > @@ -608,7 +640,7 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) > buf->state = MX2_STATE_QUEUED; > list_add_tail(&buf->internal.queue, &pcdev->capture); > > - if (cpu_is_mx25()) { > + if (is_imx25_camera(pcdev)) { > u32 csicr3, dma_inten = 0; > > if (pcdev->fb1_active == NULL) { > @@ -627,20 +659,20 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) > list_del(&buf->internal.queue); > buf->state = MX2_STATE_ACTIVE; > > - csicr3 = readl(pcdev->base_csi + CSICR3); > + csicr3 = readl(pcdev->base_csi + pcdev->reg_csicr3); > > /* Reflash DMA */ > writel(csicr3 | CSICR3_DMA_REFLASH_RFF, > - pcdev->base_csi + CSICR3); > + pcdev->base_csi + pcdev->reg_csicr3); > > /* clear & enable interrupts */ > - writel(dma_inten, pcdev->base_csi + CSISR); > + writel(dma_inten, pcdev->base_csi + pcdev->reg_csisr); > pcdev->csicr1 |= dma_inten; > writel(pcdev->csicr1, pcdev->base_csi + CSICR1); > > /* enable DMA */ > csicr3 |= CSICR3_DMA_REQ_EN_RFF | CSICR3_RXFF_LEVEL(1); > - writel(csicr3, pcdev->base_csi + CSICR3); > + writel(csicr3, pcdev->base_csi + pcdev->reg_csicr3); > } > } > > @@ -684,7 +716,7 @@ static void mx2_videobuf_release(struct vb2_buffer *vb) > */ > > spin_lock_irqsave(&pcdev->lock, flags); > - if (cpu_is_mx25() && buf->state == MX2_STATE_ACTIVE) { > + if (is_imx25_camera(pcdev) && buf->state == MX2_STATE_ACTIVE) { > if (pcdev->fb1_active == buf) { > pcdev->csicr1 &= ~CSICR1_FB1_DMA_INTEN; > writel(0, pcdev->base_csi + CSIDMASA_FB1); > @@ -807,7 +839,7 @@ static int mx2_start_streaming(struct vb2_queue *q, unsigned int count) > unsigned long phys; > int bytesperline; > > - if (cpu_is_mx27()) { > + if (is_imx27_camera(pcdev)) { > unsigned long flags; > if (count < 2) > return -EINVAL; > @@ -902,7 +934,7 @@ static int mx2_stop_streaming(struct vb2_queue *q) > void *b; > u32 cntl; > > - if (cpu_is_mx27()) { > + if (is_imx27_camera(pcdev)) { > spin_lock_irqsave(&pcdev->lock, flags); > > cntl = readl(pcdev->base_emma + PRP_CNTL); > @@ -1054,11 +1086,11 @@ static int mx2_camera_set_bus_param(struct soc_camera_device *icd) > if (bytesperline < 0) > return bytesperline; > > - if (cpu_is_mx27()) { > + if (is_imx27_camera(pcdev)) { > ret = mx27_camera_emma_prp_reset(pcdev); > if (ret) > return ret; > - } else if (cpu_is_mx25()) { > + } else if (is_imx25_camera(pcdev)) { > writel((bytesperline * icd->user_height) >> 2, > pcdev->base_csi + CSIRXCNT); > writel((bytesperline << 16) | icd->user_height, > @@ -1351,7 +1383,7 @@ static int mx2_camera_try_fmt(struct soc_camera_device *icd, > /* FIXME: implement MX27 limits */ > > /* limit to MX25 hardware capabilities */ > - if (cpu_is_mx25()) { > + if (is_imx25_camera(pcdev)) { > if (xlate->host_fmt->bits_per_sample <= 8) > width_limit = 0xffff * 4; > else > @@ -1685,6 +1717,20 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) > goto exit; > } > > + pcdev->devtype = pdev->id_entry->driver_data; > + switch (pcdev->devtype) { > + case IMX25_CAMERA: > + pcdev->reg_csisr = CSISR_IMX25; > + pcdev->reg_csicr3 = CSICR3_IMX25; > + break; > + case IMX27_CAMERA: > + pcdev->reg_csisr = CSISR_IMX27; > + pcdev->reg_csicr3 = CSICR3_IMX27; > + break; > + default: > + break; > + } > + > pcdev->clk_csi = devm_clk_get(&pdev->dev, "ahb"); > if (IS_ERR(pcdev->clk_csi)) { > dev_err(&pdev->dev, "Could not get csi clock\n"); > @@ -1722,7 +1768,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) > pcdev->dev = &pdev->dev; > platform_set_drvdata(pdev, pcdev); > > - if (cpu_is_mx25()) { > + if (is_imx25_camera(pcdev)) { > err = devm_request_irq(&pdev->dev, irq_csi, mx25_camera_irq, 0, > MX2_CAM_DRV_NAME, pcdev); > if (err) { > @@ -1731,7 +1777,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) > } > } > > - if (cpu_is_mx27()) { > + if (is_imx27_camera(pcdev)) { > err = mx27_camera_emma_init(pdev); > if (err) > goto exit; > @@ -1742,7 +1788,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) > pcdev->soc_host.priv = pcdev; > pcdev->soc_host.v4l2_dev.dev = &pdev->dev; > pcdev->soc_host.nr = pdev->id; > - if (cpu_is_mx25()) > + if (is_imx25_camera(pcdev)) > pcdev->soc_host.capabilities = SOCAM_HOST_CAP_STRIDE; > > pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); > @@ -1762,7 +1808,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) > exit_free_emma: > vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); > eallocctx: > - if (cpu_is_mx27()) { > + if (is_imx27_camera(pcdev)) { > clk_disable_unprepare(pcdev->clk_emma_ipg); > clk_disable_unprepare(pcdev->clk_emma_ahb); > } > @@ -1780,7 +1826,7 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev) > > vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); > > - if (cpu_is_mx27()) { > + if (is_imx27_camera(pcdev)) { > clk_disable_unprepare(pcdev->clk_emma_ipg); > clk_disable_unprepare(pcdev->clk_emma_ahb); > } > @@ -1794,6 +1840,7 @@ static struct platform_driver mx2_camera_driver = { > .driver = { > .name = MX2_CAM_DRV_NAME, > }, > + .id_table = mx2_camera_devtype, > .remove = __devexit_p(mx2_camera_remove), > }; > > -- > 1.7.9.5 > --- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer http://www.open-technology.de/
Hi Shawn, On 17 September 2012 11:21, Guennadi Liakhovetski <g.liakhovetski@gmx.de> wrote: > On Mon, 17 Sep 2012, Shawn Guo wrote: > >> It changes the driver to use platform_device_id rather than cpu_is_xxx >> to determine the controller type, and updates the platform code >> accordingly. >> >> As the result, mach/hardware.h inclusion gets removed from the driver. >> >> Signed-off-by: Shawn Guo <shawn.guo@linaro.org> >> Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de> >> Cc: linux-media@vger.kernel.org > > Acked-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> i.MX25 support is broken and is scheduled for removal. I think we should not keep on trying to maintain it. Couldn't we just drop it? It only makes maintenance tasks more difficult. > Thanks > Guennadi > >> --- >> arch/arm/mach-imx/clk-imx25.c | 6 +- >> arch/arm/mach-imx/clk-imx27.c | 6 +- >> arch/arm/mach-imx/devices/devices-common.h | 1 + >> arch/arm/mach-imx/devices/platform-mx2-camera.c | 12 +-- >> drivers/media/video/mx2_camera.c | 95 +++++++++++++++++------ >> 5 files changed, 85 insertions(+), 35 deletions(-) >> >> diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c >> index 1aea073..71fe521 100644 >> --- a/arch/arm/mach-imx/clk-imx25.c >> +++ b/arch/arm/mach-imx/clk-imx25.c >> @@ -231,9 +231,9 @@ int __init mx25_clocks_init(void) >> clk_register_clkdev(clk[esdhc2_ipg_per], "per", "sdhci-esdhc-imx25.1"); >> clk_register_clkdev(clk[esdhc2_ipg], "ipg", "sdhci-esdhc-imx25.1"); >> clk_register_clkdev(clk[esdhc2_ahb], "ahb", "sdhci-esdhc-imx25.1"); >> - clk_register_clkdev(clk[csi_ipg_per], "per", "mx2-camera.0"); >> - clk_register_clkdev(clk[csi_ipg], "ipg", "mx2-camera.0"); >> - clk_register_clkdev(clk[csi_ahb], "ahb", "mx2-camera.0"); >> + clk_register_clkdev(clk[csi_ipg_per], "per", "imx25-camera.0"); >> + clk_register_clkdev(clk[csi_ipg], "ipg", "imx25-camera.0"); >> + clk_register_clkdev(clk[csi_ahb], "ahb", "imx25-camera.0"); >> clk_register_clkdev(clk[dummy], "audmux", NULL); >> clk_register_clkdev(clk[can1_ipg], NULL, "flexcan.0"); >> clk_register_clkdev(clk[can2_ipg], NULL, "flexcan.1"); >> diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c >> index 5ff5cf0..e26de52 100644 >> --- a/arch/arm/mach-imx/clk-imx27.c >> +++ b/arch/arm/mach-imx/clk-imx27.c >> @@ -224,7 +224,7 @@ int __init mx27_clocks_init(unsigned long fref) >> clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0"); >> clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); >> clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0"); >> - clk_register_clkdev(clk[csi_ahb_gate], "ahb", "mx2-camera.0"); >> + clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0"); >> clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); >> clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); >> clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc"); >> @@ -251,8 +251,8 @@ int __init mx27_clocks_init(unsigned long fref) >> clk_register_clkdev(clk[i2c2_ipg_gate], NULL, "imx21-i2c.1"); >> clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0"); >> clk_register_clkdev(clk[kpp_ipg_gate], NULL, "imx-keypad"); >> - clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "mx2-camera.0"); >> - clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "mx2-camera.0"); >> + clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "imx27-camera.0"); >> + clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "imx27-camera.0"); >> clk_register_clkdev(clk[emma_ahb_gate], "ahb", "m2m-emmaprp.0"); >> clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0"); >> clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL); >> diff --git a/arch/arm/mach-imx/devices/devices-common.h b/arch/arm/mach-imx/devices/devices-common.h >> index 7f2698c..8112a1a 100644 >> --- a/arch/arm/mach-imx/devices/devices-common.h >> +++ b/arch/arm/mach-imx/devices/devices-common.h >> @@ -202,6 +202,7 @@ struct platform_device *__init imx_add_mx3_sdc_fb( >> >> #include <linux/platform_data/camera-mx2.h> >> struct imx_mx2_camera_data { >> + const char *devid; >> resource_size_t iobasecsi; >> resource_size_t iosizecsi; >> resource_size_t irqcsi; >> diff --git a/arch/arm/mach-imx/devices/platform-mx2-camera.c b/arch/arm/mach-imx/devices/platform-mx2-camera.c >> index 9ad5b2d..b88877d 100644 >> --- a/arch/arm/mach-imx/devices/platform-mx2-camera.c >> +++ b/arch/arm/mach-imx/devices/platform-mx2-camera.c >> @@ -9,14 +9,16 @@ >> #include <mach/hardware.h> >> #include "devices-common.h" >> >> -#define imx_mx2_camera_data_entry_single(soc) \ >> +#define imx_mx2_camera_data_entry_single(soc, _devid) \ >> { \ >> + .devid = _devid, \ >> .iobasecsi = soc ## _CSI_BASE_ADDR, \ >> .iosizecsi = SZ_4K, \ >> .irqcsi = soc ## _INT_CSI, \ >> } >> -#define imx_mx2_camera_data_entry_single_emma(soc) \ >> +#define imx_mx2_camera_data_entry_single_emma(soc, _devid) \ >> { \ >> + .devid = _devid, \ >> .iobasecsi = soc ## _CSI_BASE_ADDR, \ >> .iosizecsi = SZ_32, \ >> .irqcsi = soc ## _INT_CSI, \ >> @@ -27,12 +29,12 @@ >> >> #ifdef CONFIG_SOC_IMX25 >> const struct imx_mx2_camera_data imx25_mx2_camera_data __initconst = >> - imx_mx2_camera_data_entry_single(MX25); >> + imx_mx2_camera_data_entry_single(MX25, "imx25-camera"); >> #endif /* ifdef CONFIG_SOC_IMX25 */ >> >> #ifdef CONFIG_SOC_IMX27 >> const struct imx_mx2_camera_data imx27_mx2_camera_data __initconst = >> - imx_mx2_camera_data_entry_single_emma(MX27); >> + imx_mx2_camera_data_entry_single_emma(MX27, "imx27-camera"); >> #endif /* ifdef CONFIG_SOC_IMX27 */ >> >> struct platform_device *__init imx_add_mx2_camera( >> @@ -58,7 +60,7 @@ struct platform_device *__init imx_add_mx2_camera( >> .flags = IORESOURCE_IRQ, >> }, >> }; >> - return imx_add_platform_device_dmamask("mx2-camera", 0, >> + return imx_add_platform_device_dmamask(data->devid, 0, >> res, data->iobaseemmaprp ? 4 : 2, >> pdata, sizeof(*pdata), DMA_BIT_MASK(32)); >> } >> diff --git a/drivers/media/video/mx2_camera.c b/drivers/media/video/mx2_camera.c >> index fe4c76c..cde3374 100644 >> --- a/drivers/media/video/mx2_camera.c >> +++ b/drivers/media/video/mx2_camera.c >> @@ -41,7 +41,6 @@ >> #include <linux/videodev2.h> >> >> #include <linux/platform_data/camera-mx2.h> >> -#include <mach/hardware.h> >> >> #include <asm/dma.h> >> >> @@ -121,11 +120,13 @@ >> >> #define CSICR1 0x00 >> #define CSICR2 0x04 >> -#define CSISR (cpu_is_mx27() ? 0x08 : 0x18) >> +#define CSISR_IMX25 0x18 >> +#define CSISR_IMX27 0x08 >> #define CSISTATFIFO 0x0c >> #define CSIRFIFO 0x10 >> #define CSIRXCNT 0x14 >> -#define CSICR3 (cpu_is_mx27() ? 0x1C : 0x08) >> +#define CSICR3_IMX25 0x08 >> +#define CSICR3_IMX27 0x1c >> #define CSIDMASA_STATFIFO 0x20 >> #define CSIDMATA_STATFIFO 0x24 >> #define CSIDMASA_FB1 0x28 >> @@ -268,6 +269,11 @@ struct mx2_buffer { >> struct mx2_buf_internal internal; >> }; >> >> +enum mx2_camera_type { >> + IMX25_CAMERA, >> + IMX27_CAMERA, >> +}; >> + >> struct mx2_camera_dev { >> struct device *dev; >> struct soc_camera_host soc_host; >> @@ -291,6 +297,9 @@ struct mx2_camera_dev { >> struct mx2_buffer *fb2_active; >> >> u32 csicr1; >> + u32 reg_csisr; >> + u32 reg_csicr3; >> + enum mx2_camera_type devtype; >> >> struct mx2_buf_internal buf_discard[2]; >> void *discard_buffer; >> @@ -303,6 +312,29 @@ struct mx2_camera_dev { >> struct vb2_alloc_ctx *alloc_ctx; >> }; >> >> +static struct platform_device_id mx2_camera_devtype[] = { >> + { >> + .name = "imx25-camera", >> + .driver_data = IMX25_CAMERA, >> + }, { >> + .name = "imx27-camera", >> + .driver_data = IMX27_CAMERA, >> + }, { >> + /* sentinel */ >> + } >> +}; >> +MODULE_DEVICE_TABLE(platform, mx2_camera_devtype); >> + >> +static inline int is_imx25_camera(struct mx2_camera_dev *pcdev) >> +{ >> + return pcdev->devtype == IMX25_CAMERA; >> +} >> + >> +static inline int is_imx27_camera(struct mx2_camera_dev *pcdev) >> +{ >> + return pcdev->devtype == IMX27_CAMERA; >> +} >> + >> static struct mx2_buffer *mx2_ibuf_to_buf(struct mx2_buf_internal *int_buf) >> { >> return container_of(int_buf, struct mx2_buffer, internal); >> @@ -406,9 +438,9 @@ static void mx2_camera_deactivate(struct mx2_camera_dev *pcdev) >> >> clk_disable_unprepare(pcdev->clk_csi); >> writel(0, pcdev->base_csi + CSICR1); >> - if (cpu_is_mx27()) { >> + if (is_imx27_camera(pcdev)) { >> writel(0, pcdev->base_emma + PRP_CNTL); >> - } else if (cpu_is_mx25()) { >> + } else if (is_imx25_camera(pcdev)) { >> spin_lock_irqsave(&pcdev->lock, flags); >> pcdev->fb1_active = NULL; >> pcdev->fb2_active = NULL; >> @@ -438,7 +470,7 @@ static int mx2_camera_add_device(struct soc_camera_device *icd) >> >> csicr1 = CSICR1_MCLKEN; >> >> - if (cpu_is_mx27()) >> + if (is_imx27_camera(pcdev)) >> csicr1 |= CSICR1_PRP_IF_EN | CSICR1_FCC | >> CSICR1_RXFF_LEVEL(0); >> >> @@ -514,7 +546,7 @@ out: >> static irqreturn_t mx25_camera_irq(int irq_csi, void *data) >> { >> struct mx2_camera_dev *pcdev = data; >> - u32 status = readl(pcdev->base_csi + CSISR); >> + u32 status = readl(pcdev->base_csi + pcdev->reg_csisr); >> >> if (status & CSISR_DMA_TSF_FB1_INT) >> mx25_camera_frame_done(pcdev, 1, MX2_STATE_DONE); >> @@ -523,7 +555,7 @@ static irqreturn_t mx25_camera_irq(int irq_csi, void *data) >> >> /* FIXME: handle CSISR_RFF_OR_INT */ >> >> - writel(status, pcdev->base_csi + CSISR); >> + writel(status, pcdev->base_csi + pcdev->reg_csisr); >> >> return IRQ_HANDLED; >> } >> @@ -608,7 +640,7 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) >> buf->state = MX2_STATE_QUEUED; >> list_add_tail(&buf->internal.queue, &pcdev->capture); >> >> - if (cpu_is_mx25()) { >> + if (is_imx25_camera(pcdev)) { >> u32 csicr3, dma_inten = 0; >> >> if (pcdev->fb1_active == NULL) { >> @@ -627,20 +659,20 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) >> list_del(&buf->internal.queue); >> buf->state = MX2_STATE_ACTIVE; >> >> - csicr3 = readl(pcdev->base_csi + CSICR3); >> + csicr3 = readl(pcdev->base_csi + pcdev->reg_csicr3); >> >> /* Reflash DMA */ >> writel(csicr3 | CSICR3_DMA_REFLASH_RFF, >> - pcdev->base_csi + CSICR3); >> + pcdev->base_csi + pcdev->reg_csicr3); >> >> /* clear & enable interrupts */ >> - writel(dma_inten, pcdev->base_csi + CSISR); >> + writel(dma_inten, pcdev->base_csi + pcdev->reg_csisr); >> pcdev->csicr1 |= dma_inten; >> writel(pcdev->csicr1, pcdev->base_csi + CSICR1); >> >> /* enable DMA */ >> csicr3 |= CSICR3_DMA_REQ_EN_RFF | CSICR3_RXFF_LEVEL(1); >> - writel(csicr3, pcdev->base_csi + CSICR3); >> + writel(csicr3, pcdev->base_csi + pcdev->reg_csicr3); >> } >> } >> >> @@ -684,7 +716,7 @@ static void mx2_videobuf_release(struct vb2_buffer *vb) >> */ >> >> spin_lock_irqsave(&pcdev->lock, flags); >> - if (cpu_is_mx25() && buf->state == MX2_STATE_ACTIVE) { >> + if (is_imx25_camera(pcdev) && buf->state == MX2_STATE_ACTIVE) { >> if (pcdev->fb1_active == buf) { >> pcdev->csicr1 &= ~CSICR1_FB1_DMA_INTEN; >> writel(0, pcdev->base_csi + CSIDMASA_FB1); >> @@ -807,7 +839,7 @@ static int mx2_start_streaming(struct vb2_queue *q, unsigned int count) >> unsigned long phys; >> int bytesperline; >> >> - if (cpu_is_mx27()) { >> + if (is_imx27_camera(pcdev)) { >> unsigned long flags; >> if (count < 2) >> return -EINVAL; >> @@ -902,7 +934,7 @@ static int mx2_stop_streaming(struct vb2_queue *q) >> void *b; >> u32 cntl; >> >> - if (cpu_is_mx27()) { >> + if (is_imx27_camera(pcdev)) { >> spin_lock_irqsave(&pcdev->lock, flags); >> >> cntl = readl(pcdev->base_emma + PRP_CNTL); >> @@ -1054,11 +1086,11 @@ static int mx2_camera_set_bus_param(struct soc_camera_device *icd) >> if (bytesperline < 0) >> return bytesperline; >> >> - if (cpu_is_mx27()) { >> + if (is_imx27_camera(pcdev)) { >> ret = mx27_camera_emma_prp_reset(pcdev); >> if (ret) >> return ret; >> - } else if (cpu_is_mx25()) { >> + } else if (is_imx25_camera(pcdev)) { >> writel((bytesperline * icd->user_height) >> 2, >> pcdev->base_csi + CSIRXCNT); >> writel((bytesperline << 16) | icd->user_height, >> @@ -1351,7 +1383,7 @@ static int mx2_camera_try_fmt(struct soc_camera_device *icd, >> /* FIXME: implement MX27 limits */ >> >> /* limit to MX25 hardware capabilities */ >> - if (cpu_is_mx25()) { >> + if (is_imx25_camera(pcdev)) { >> if (xlate->host_fmt->bits_per_sample <= 8) >> width_limit = 0xffff * 4; >> else >> @@ -1685,6 +1717,20 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >> goto exit; >> } >> >> + pcdev->devtype = pdev->id_entry->driver_data; >> + switch (pcdev->devtype) { >> + case IMX25_CAMERA: >> + pcdev->reg_csisr = CSISR_IMX25; >> + pcdev->reg_csicr3 = CSICR3_IMX25; >> + break; >> + case IMX27_CAMERA: >> + pcdev->reg_csisr = CSISR_IMX27; >> + pcdev->reg_csicr3 = CSICR3_IMX27; >> + break; >> + default: >> + break; >> + } >> + >> pcdev->clk_csi = devm_clk_get(&pdev->dev, "ahb"); >> if (IS_ERR(pcdev->clk_csi)) { >> dev_err(&pdev->dev, "Could not get csi clock\n"); >> @@ -1722,7 +1768,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >> pcdev->dev = &pdev->dev; >> platform_set_drvdata(pdev, pcdev); >> >> - if (cpu_is_mx25()) { >> + if (is_imx25_camera(pcdev)) { >> err = devm_request_irq(&pdev->dev, irq_csi, mx25_camera_irq, 0, >> MX2_CAM_DRV_NAME, pcdev); >> if (err) { >> @@ -1731,7 +1777,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >> } >> } >> >> - if (cpu_is_mx27()) { >> + if (is_imx27_camera(pcdev)) { >> err = mx27_camera_emma_init(pdev); >> if (err) >> goto exit; >> @@ -1742,7 +1788,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >> pcdev->soc_host.priv = pcdev; >> pcdev->soc_host.v4l2_dev.dev = &pdev->dev; >> pcdev->soc_host.nr = pdev->id; >> - if (cpu_is_mx25()) >> + if (is_imx25_camera(pcdev)) >> pcdev->soc_host.capabilities = SOCAM_HOST_CAP_STRIDE; >> >> pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); >> @@ -1762,7 +1808,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >> exit_free_emma: >> vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); >> eallocctx: >> - if (cpu_is_mx27()) { >> + if (is_imx27_camera(pcdev)) { >> clk_disable_unprepare(pcdev->clk_emma_ipg); >> clk_disable_unprepare(pcdev->clk_emma_ahb); >> } >> @@ -1780,7 +1826,7 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev) >> >> vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); >> >> - if (cpu_is_mx27()) { >> + if (is_imx27_camera(pcdev)) { >> clk_disable_unprepare(pcdev->clk_emma_ipg); >> clk_disable_unprepare(pcdev->clk_emma_ahb); >> } >> @@ -1794,6 +1840,7 @@ static struct platform_driver mx2_camera_driver = { >> .driver = { >> .name = MX2_CAM_DRV_NAME, >> }, >> + .id_table = mx2_camera_devtype, >> .remove = __devexit_p(mx2_camera_remove), >> }; >> >> -- >> 1.7.9.5 I can't test this patch because it depends heavily on the previous one, which breaks the driver. Regards.
On Mon, 17 Sep 2012, javier Martin wrote: > Hi Shawn, > > On 17 September 2012 11:21, Guennadi Liakhovetski <g.liakhovetski@gmx.de> wrote: > > On Mon, 17 Sep 2012, Shawn Guo wrote: > > > >> It changes the driver to use platform_device_id rather than cpu_is_xxx > >> to determine the controller type, and updates the platform code > >> accordingly. > >> > >> As the result, mach/hardware.h inclusion gets removed from the driver. > >> > >> Signed-off-by: Shawn Guo <shawn.guo@linaro.org> > >> Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de> > >> Cc: linux-media@vger.kernel.org > > > > Acked-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> > > i.MX25 support is broken and is scheduled for removal. It is not yet, I haven't pushed those your patches yet. Thanks Guennadi > I think we should not keep on trying to maintain it. Couldn't we just > drop it? It only makes maintenance tasks more difficult. > > > Thanks > > Guennadi > > > >> --- > >> arch/arm/mach-imx/clk-imx25.c | 6 +- > >> arch/arm/mach-imx/clk-imx27.c | 6 +- > >> arch/arm/mach-imx/devices/devices-common.h | 1 + > >> arch/arm/mach-imx/devices/platform-mx2-camera.c | 12 +-- > >> drivers/media/video/mx2_camera.c | 95 +++++++++++++++++------ > >> 5 files changed, 85 insertions(+), 35 deletions(-) > >> > >> diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c > >> index 1aea073..71fe521 100644 > >> --- a/arch/arm/mach-imx/clk-imx25.c > >> +++ b/arch/arm/mach-imx/clk-imx25.c > >> @@ -231,9 +231,9 @@ int __init mx25_clocks_init(void) > >> clk_register_clkdev(clk[esdhc2_ipg_per], "per", "sdhci-esdhc-imx25.1"); > >> clk_register_clkdev(clk[esdhc2_ipg], "ipg", "sdhci-esdhc-imx25.1"); > >> clk_register_clkdev(clk[esdhc2_ahb], "ahb", "sdhci-esdhc-imx25.1"); > >> - clk_register_clkdev(clk[csi_ipg_per], "per", "mx2-camera.0"); > >> - clk_register_clkdev(clk[csi_ipg], "ipg", "mx2-camera.0"); > >> - clk_register_clkdev(clk[csi_ahb], "ahb", "mx2-camera.0"); > >> + clk_register_clkdev(clk[csi_ipg_per], "per", "imx25-camera.0"); > >> + clk_register_clkdev(clk[csi_ipg], "ipg", "imx25-camera.0"); > >> + clk_register_clkdev(clk[csi_ahb], "ahb", "imx25-camera.0"); > >> clk_register_clkdev(clk[dummy], "audmux", NULL); > >> clk_register_clkdev(clk[can1_ipg], NULL, "flexcan.0"); > >> clk_register_clkdev(clk[can2_ipg], NULL, "flexcan.1"); > >> diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c > >> index 5ff5cf0..e26de52 100644 > >> --- a/arch/arm/mach-imx/clk-imx27.c > >> +++ b/arch/arm/mach-imx/clk-imx27.c > >> @@ -224,7 +224,7 @@ int __init mx27_clocks_init(unsigned long fref) > >> clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0"); > >> clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); > >> clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0"); > >> - clk_register_clkdev(clk[csi_ahb_gate], "ahb", "mx2-camera.0"); > >> + clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0"); > >> clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); > >> clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); > >> clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc"); > >> @@ -251,8 +251,8 @@ int __init mx27_clocks_init(unsigned long fref) > >> clk_register_clkdev(clk[i2c2_ipg_gate], NULL, "imx21-i2c.1"); > >> clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0"); > >> clk_register_clkdev(clk[kpp_ipg_gate], NULL, "imx-keypad"); > >> - clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "mx2-camera.0"); > >> - clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "mx2-camera.0"); > >> + clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "imx27-camera.0"); > >> + clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "imx27-camera.0"); > >> clk_register_clkdev(clk[emma_ahb_gate], "ahb", "m2m-emmaprp.0"); > >> clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0"); > >> clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL); > >> diff --git a/arch/arm/mach-imx/devices/devices-common.h b/arch/arm/mach-imx/devices/devices-common.h > >> index 7f2698c..8112a1a 100644 > >> --- a/arch/arm/mach-imx/devices/devices-common.h > >> +++ b/arch/arm/mach-imx/devices/devices-common.h > >> @@ -202,6 +202,7 @@ struct platform_device *__init imx_add_mx3_sdc_fb( > >> > >> #include <linux/platform_data/camera-mx2.h> > >> struct imx_mx2_camera_data { > >> + const char *devid; > >> resource_size_t iobasecsi; > >> resource_size_t iosizecsi; > >> resource_size_t irqcsi; > >> diff --git a/arch/arm/mach-imx/devices/platform-mx2-camera.c b/arch/arm/mach-imx/devices/platform-mx2-camera.c > >> index 9ad5b2d..b88877d 100644 > >> --- a/arch/arm/mach-imx/devices/platform-mx2-camera.c > >> +++ b/arch/arm/mach-imx/devices/platform-mx2-camera.c > >> @@ -9,14 +9,16 @@ > >> #include <mach/hardware.h> > >> #include "devices-common.h" > >> > >> -#define imx_mx2_camera_data_entry_single(soc) \ > >> +#define imx_mx2_camera_data_entry_single(soc, _devid) \ > >> { \ > >> + .devid = _devid, \ > >> .iobasecsi = soc ## _CSI_BASE_ADDR, \ > >> .iosizecsi = SZ_4K, \ > >> .irqcsi = soc ## _INT_CSI, \ > >> } > >> -#define imx_mx2_camera_data_entry_single_emma(soc) \ > >> +#define imx_mx2_camera_data_entry_single_emma(soc, _devid) \ > >> { \ > >> + .devid = _devid, \ > >> .iobasecsi = soc ## _CSI_BASE_ADDR, \ > >> .iosizecsi = SZ_32, \ > >> .irqcsi = soc ## _INT_CSI, \ > >> @@ -27,12 +29,12 @@ > >> > >> #ifdef CONFIG_SOC_IMX25 > >> const struct imx_mx2_camera_data imx25_mx2_camera_data __initconst = > >> - imx_mx2_camera_data_entry_single(MX25); > >> + imx_mx2_camera_data_entry_single(MX25, "imx25-camera"); > >> #endif /* ifdef CONFIG_SOC_IMX25 */ > >> > >> #ifdef CONFIG_SOC_IMX27 > >> const struct imx_mx2_camera_data imx27_mx2_camera_data __initconst = > >> - imx_mx2_camera_data_entry_single_emma(MX27); > >> + imx_mx2_camera_data_entry_single_emma(MX27, "imx27-camera"); > >> #endif /* ifdef CONFIG_SOC_IMX27 */ > >> > >> struct platform_device *__init imx_add_mx2_camera( > >> @@ -58,7 +60,7 @@ struct platform_device *__init imx_add_mx2_camera( > >> .flags = IORESOURCE_IRQ, > >> }, > >> }; > >> - return imx_add_platform_device_dmamask("mx2-camera", 0, > >> + return imx_add_platform_device_dmamask(data->devid, 0, > >> res, data->iobaseemmaprp ? 4 : 2, > >> pdata, sizeof(*pdata), DMA_BIT_MASK(32)); > >> } > >> diff --git a/drivers/media/video/mx2_camera.c b/drivers/media/video/mx2_camera.c > >> index fe4c76c..cde3374 100644 > >> --- a/drivers/media/video/mx2_camera.c > >> +++ b/drivers/media/video/mx2_camera.c > >> @@ -41,7 +41,6 @@ > >> #include <linux/videodev2.h> > >> > >> #include <linux/platform_data/camera-mx2.h> > >> -#include <mach/hardware.h> > >> > >> #include <asm/dma.h> > >> > >> @@ -121,11 +120,13 @@ > >> > >> #define CSICR1 0x00 > >> #define CSICR2 0x04 > >> -#define CSISR (cpu_is_mx27() ? 0x08 : 0x18) > >> +#define CSISR_IMX25 0x18 > >> +#define CSISR_IMX27 0x08 > >> #define CSISTATFIFO 0x0c > >> #define CSIRFIFO 0x10 > >> #define CSIRXCNT 0x14 > >> -#define CSICR3 (cpu_is_mx27() ? 0x1C : 0x08) > >> +#define CSICR3_IMX25 0x08 > >> +#define CSICR3_IMX27 0x1c > >> #define CSIDMASA_STATFIFO 0x20 > >> #define CSIDMATA_STATFIFO 0x24 > >> #define CSIDMASA_FB1 0x28 > >> @@ -268,6 +269,11 @@ struct mx2_buffer { > >> struct mx2_buf_internal internal; > >> }; > >> > >> +enum mx2_camera_type { > >> + IMX25_CAMERA, > >> + IMX27_CAMERA, > >> +}; > >> + > >> struct mx2_camera_dev { > >> struct device *dev; > >> struct soc_camera_host soc_host; > >> @@ -291,6 +297,9 @@ struct mx2_camera_dev { > >> struct mx2_buffer *fb2_active; > >> > >> u32 csicr1; > >> + u32 reg_csisr; > >> + u32 reg_csicr3; > >> + enum mx2_camera_type devtype; > >> > >> struct mx2_buf_internal buf_discard[2]; > >> void *discard_buffer; > >> @@ -303,6 +312,29 @@ struct mx2_camera_dev { > >> struct vb2_alloc_ctx *alloc_ctx; > >> }; > >> > >> +static struct platform_device_id mx2_camera_devtype[] = { > >> + { > >> + .name = "imx25-camera", > >> + .driver_data = IMX25_CAMERA, > >> + }, { > >> + .name = "imx27-camera", > >> + .driver_data = IMX27_CAMERA, > >> + }, { > >> + /* sentinel */ > >> + } > >> +}; > >> +MODULE_DEVICE_TABLE(platform, mx2_camera_devtype); > >> + > >> +static inline int is_imx25_camera(struct mx2_camera_dev *pcdev) > >> +{ > >> + return pcdev->devtype == IMX25_CAMERA; > >> +} > >> + > >> +static inline int is_imx27_camera(struct mx2_camera_dev *pcdev) > >> +{ > >> + return pcdev->devtype == IMX27_CAMERA; > >> +} > >> + > >> static struct mx2_buffer *mx2_ibuf_to_buf(struct mx2_buf_internal *int_buf) > >> { > >> return container_of(int_buf, struct mx2_buffer, internal); > >> @@ -406,9 +438,9 @@ static void mx2_camera_deactivate(struct mx2_camera_dev *pcdev) > >> > >> clk_disable_unprepare(pcdev->clk_csi); > >> writel(0, pcdev->base_csi + CSICR1); > >> - if (cpu_is_mx27()) { > >> + if (is_imx27_camera(pcdev)) { > >> writel(0, pcdev->base_emma + PRP_CNTL); > >> - } else if (cpu_is_mx25()) { > >> + } else if (is_imx25_camera(pcdev)) { > >> spin_lock_irqsave(&pcdev->lock, flags); > >> pcdev->fb1_active = NULL; > >> pcdev->fb2_active = NULL; > >> @@ -438,7 +470,7 @@ static int mx2_camera_add_device(struct soc_camera_device *icd) > >> > >> csicr1 = CSICR1_MCLKEN; > >> > >> - if (cpu_is_mx27()) > >> + if (is_imx27_camera(pcdev)) > >> csicr1 |= CSICR1_PRP_IF_EN | CSICR1_FCC | > >> CSICR1_RXFF_LEVEL(0); > >> > >> @@ -514,7 +546,7 @@ out: > >> static irqreturn_t mx25_camera_irq(int irq_csi, void *data) > >> { > >> struct mx2_camera_dev *pcdev = data; > >> - u32 status = readl(pcdev->base_csi + CSISR); > >> + u32 status = readl(pcdev->base_csi + pcdev->reg_csisr); > >> > >> if (status & CSISR_DMA_TSF_FB1_INT) > >> mx25_camera_frame_done(pcdev, 1, MX2_STATE_DONE); > >> @@ -523,7 +555,7 @@ static irqreturn_t mx25_camera_irq(int irq_csi, void *data) > >> > >> /* FIXME: handle CSISR_RFF_OR_INT */ > >> > >> - writel(status, pcdev->base_csi + CSISR); > >> + writel(status, pcdev->base_csi + pcdev->reg_csisr); > >> > >> return IRQ_HANDLED; > >> } > >> @@ -608,7 +640,7 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) > >> buf->state = MX2_STATE_QUEUED; > >> list_add_tail(&buf->internal.queue, &pcdev->capture); > >> > >> - if (cpu_is_mx25()) { > >> + if (is_imx25_camera(pcdev)) { > >> u32 csicr3, dma_inten = 0; > >> > >> if (pcdev->fb1_active == NULL) { > >> @@ -627,20 +659,20 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) > >> list_del(&buf->internal.queue); > >> buf->state = MX2_STATE_ACTIVE; > >> > >> - csicr3 = readl(pcdev->base_csi + CSICR3); > >> + csicr3 = readl(pcdev->base_csi + pcdev->reg_csicr3); > >> > >> /* Reflash DMA */ > >> writel(csicr3 | CSICR3_DMA_REFLASH_RFF, > >> - pcdev->base_csi + CSICR3); > >> + pcdev->base_csi + pcdev->reg_csicr3); > >> > >> /* clear & enable interrupts */ > >> - writel(dma_inten, pcdev->base_csi + CSISR); > >> + writel(dma_inten, pcdev->base_csi + pcdev->reg_csisr); > >> pcdev->csicr1 |= dma_inten; > >> writel(pcdev->csicr1, pcdev->base_csi + CSICR1); > >> > >> /* enable DMA */ > >> csicr3 |= CSICR3_DMA_REQ_EN_RFF | CSICR3_RXFF_LEVEL(1); > >> - writel(csicr3, pcdev->base_csi + CSICR3); > >> + writel(csicr3, pcdev->base_csi + pcdev->reg_csicr3); > >> } > >> } > >> > >> @@ -684,7 +716,7 @@ static void mx2_videobuf_release(struct vb2_buffer *vb) > >> */ > >> > >> spin_lock_irqsave(&pcdev->lock, flags); > >> - if (cpu_is_mx25() && buf->state == MX2_STATE_ACTIVE) { > >> + if (is_imx25_camera(pcdev) && buf->state == MX2_STATE_ACTIVE) { > >> if (pcdev->fb1_active == buf) { > >> pcdev->csicr1 &= ~CSICR1_FB1_DMA_INTEN; > >> writel(0, pcdev->base_csi + CSIDMASA_FB1); > >> @@ -807,7 +839,7 @@ static int mx2_start_streaming(struct vb2_queue *q, unsigned int count) > >> unsigned long phys; > >> int bytesperline; > >> > >> - if (cpu_is_mx27()) { > >> + if (is_imx27_camera(pcdev)) { > >> unsigned long flags; > >> if (count < 2) > >> return -EINVAL; > >> @@ -902,7 +934,7 @@ static int mx2_stop_streaming(struct vb2_queue *q) > >> void *b; > >> u32 cntl; > >> > >> - if (cpu_is_mx27()) { > >> + if (is_imx27_camera(pcdev)) { > >> spin_lock_irqsave(&pcdev->lock, flags); > >> > >> cntl = readl(pcdev->base_emma + PRP_CNTL); > >> @@ -1054,11 +1086,11 @@ static int mx2_camera_set_bus_param(struct soc_camera_device *icd) > >> if (bytesperline < 0) > >> return bytesperline; > >> > >> - if (cpu_is_mx27()) { > >> + if (is_imx27_camera(pcdev)) { > >> ret = mx27_camera_emma_prp_reset(pcdev); > >> if (ret) > >> return ret; > >> - } else if (cpu_is_mx25()) { > >> + } else if (is_imx25_camera(pcdev)) { > >> writel((bytesperline * icd->user_height) >> 2, > >> pcdev->base_csi + CSIRXCNT); > >> writel((bytesperline << 16) | icd->user_height, > >> @@ -1351,7 +1383,7 @@ static int mx2_camera_try_fmt(struct soc_camera_device *icd, > >> /* FIXME: implement MX27 limits */ > >> > >> /* limit to MX25 hardware capabilities */ > >> - if (cpu_is_mx25()) { > >> + if (is_imx25_camera(pcdev)) { > >> if (xlate->host_fmt->bits_per_sample <= 8) > >> width_limit = 0xffff * 4; > >> else > >> @@ -1685,6 +1717,20 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) > >> goto exit; > >> } > >> > >> + pcdev->devtype = pdev->id_entry->driver_data; > >> + switch (pcdev->devtype) { > >> + case IMX25_CAMERA: > >> + pcdev->reg_csisr = CSISR_IMX25; > >> + pcdev->reg_csicr3 = CSICR3_IMX25; > >> + break; > >> + case IMX27_CAMERA: > >> + pcdev->reg_csisr = CSISR_IMX27; > >> + pcdev->reg_csicr3 = CSICR3_IMX27; > >> + break; > >> + default: > >> + break; > >> + } > >> + > >> pcdev->clk_csi = devm_clk_get(&pdev->dev, "ahb"); > >> if (IS_ERR(pcdev->clk_csi)) { > >> dev_err(&pdev->dev, "Could not get csi clock\n"); > >> @@ -1722,7 +1768,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) > >> pcdev->dev = &pdev->dev; > >> platform_set_drvdata(pdev, pcdev); > >> > >> - if (cpu_is_mx25()) { > >> + if (is_imx25_camera(pcdev)) { > >> err = devm_request_irq(&pdev->dev, irq_csi, mx25_camera_irq, 0, > >> MX2_CAM_DRV_NAME, pcdev); > >> if (err) { > >> @@ -1731,7 +1777,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) > >> } > >> } > >> > >> - if (cpu_is_mx27()) { > >> + if (is_imx27_camera(pcdev)) { > >> err = mx27_camera_emma_init(pdev); > >> if (err) > >> goto exit; > >> @@ -1742,7 +1788,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) > >> pcdev->soc_host.priv = pcdev; > >> pcdev->soc_host.v4l2_dev.dev = &pdev->dev; > >> pcdev->soc_host.nr = pdev->id; > >> - if (cpu_is_mx25()) > >> + if (is_imx25_camera(pcdev)) > >> pcdev->soc_host.capabilities = SOCAM_HOST_CAP_STRIDE; > >> > >> pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); > >> @@ -1762,7 +1808,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) > >> exit_free_emma: > >> vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); > >> eallocctx: > >> - if (cpu_is_mx27()) { > >> + if (is_imx27_camera(pcdev)) { > >> clk_disable_unprepare(pcdev->clk_emma_ipg); > >> clk_disable_unprepare(pcdev->clk_emma_ahb); > >> } > >> @@ -1780,7 +1826,7 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev) > >> > >> vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); > >> > >> - if (cpu_is_mx27()) { > >> + if (is_imx27_camera(pcdev)) { > >> clk_disable_unprepare(pcdev->clk_emma_ipg); > >> clk_disable_unprepare(pcdev->clk_emma_ahb); > >> } > >> @@ -1794,6 +1840,7 @@ static struct platform_driver mx2_camera_driver = { > >> .driver = { > >> .name = MX2_CAM_DRV_NAME, > >> }, > >> + .id_table = mx2_camera_devtype, > >> .remove = __devexit_p(mx2_camera_remove), > >> }; > >> > >> -- > >> 1.7.9.5 > > I can't test this patch because it depends heavily on the previous > one, which breaks the driver. > > Regards. > > -- > Javier Martin > Vista Silicon S.L. > CDTUC - FASE C - Oficina S-345 > Avda de los Castros s/n > 39005- Santander. Cantabria. Spain > +34 942 25 32 60 > www.vista-silicon.com > --- Guennadi Liakhovetski, Ph.D. Freelance Open-Source Software Developer http://www.open-technology.de/
On 17 September 2012 15:59, Guennadi Liakhovetski <g.liakhovetski@gmx.de> wrote: > On Mon, 17 Sep 2012, javier Martin wrote: > >> Hi Shawn, >> >> On 17 September 2012 11:21, Guennadi Liakhovetski <g.liakhovetski@gmx.de> wrote: >> > On Mon, 17 Sep 2012, Shawn Guo wrote: >> > >> >> It changes the driver to use platform_device_id rather than cpu_is_xxx >> >> to determine the controller type, and updates the platform code >> >> accordingly. >> >> >> >> As the result, mach/hardware.h inclusion gets removed from the driver. >> >> >> >> Signed-off-by: Shawn Guo <shawn.guo@linaro.org> >> >> Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de> >> >> Cc: linux-media@vger.kernel.org >> > Tested-by: Javier Martin <javier.martin@vista-silicon.com> >> > Acked-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> >> >> i.MX25 support is broken and is scheduled for removal. > > It is not yet, I haven't pushed those your patches yet. > > Thanks > Guennadi > >> I think we should not keep on trying to maintain it. Couldn't we just >> drop it? It only makes maintenance tasks more difficult. >> >> > Thanks >> > Guennadi >> > >> >> --- >> >> arch/arm/mach-imx/clk-imx25.c | 6 +- >> >> arch/arm/mach-imx/clk-imx27.c | 6 +- >> >> arch/arm/mach-imx/devices/devices-common.h | 1 + >> >> arch/arm/mach-imx/devices/platform-mx2-camera.c | 12 +-- >> >> drivers/media/video/mx2_camera.c | 95 +++++++++++++++++------ >> >> 5 files changed, 85 insertions(+), 35 deletions(-) >> >> >> >> diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c >> >> index 1aea073..71fe521 100644 >> >> --- a/arch/arm/mach-imx/clk-imx25.c >> >> +++ b/arch/arm/mach-imx/clk-imx25.c >> >> @@ -231,9 +231,9 @@ int __init mx25_clocks_init(void) >> >> clk_register_clkdev(clk[esdhc2_ipg_per], "per", "sdhci-esdhc-imx25.1"); >> >> clk_register_clkdev(clk[esdhc2_ipg], "ipg", "sdhci-esdhc-imx25.1"); >> >> clk_register_clkdev(clk[esdhc2_ahb], "ahb", "sdhci-esdhc-imx25.1"); >> >> - clk_register_clkdev(clk[csi_ipg_per], "per", "mx2-camera.0"); >> >> - clk_register_clkdev(clk[csi_ipg], "ipg", "mx2-camera.0"); >> >> - clk_register_clkdev(clk[csi_ahb], "ahb", "mx2-camera.0"); >> >> + clk_register_clkdev(clk[csi_ipg_per], "per", "imx25-camera.0"); >> >> + clk_register_clkdev(clk[csi_ipg], "ipg", "imx25-camera.0"); >> >> + clk_register_clkdev(clk[csi_ahb], "ahb", "imx25-camera.0"); >> >> clk_register_clkdev(clk[dummy], "audmux", NULL); >> >> clk_register_clkdev(clk[can1_ipg], NULL, "flexcan.0"); >> >> clk_register_clkdev(clk[can2_ipg], NULL, "flexcan.1"); >> >> diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c >> >> index 5ff5cf0..e26de52 100644 >> >> --- a/arch/arm/mach-imx/clk-imx27.c >> >> +++ b/arch/arm/mach-imx/clk-imx27.c >> >> @@ -224,7 +224,7 @@ int __init mx27_clocks_init(unsigned long fref) >> >> clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0"); >> >> clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); >> >> clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0"); >> >> - clk_register_clkdev(clk[csi_ahb_gate], "ahb", "mx2-camera.0"); >> >> + clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0"); >> >> clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); >> >> clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); >> >> clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc"); >> >> @@ -251,8 +251,8 @@ int __init mx27_clocks_init(unsigned long fref) >> >> clk_register_clkdev(clk[i2c2_ipg_gate], NULL, "imx21-i2c.1"); >> >> clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0"); >> >> clk_register_clkdev(clk[kpp_ipg_gate], NULL, "imx-keypad"); >> >> - clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "mx2-camera.0"); >> >> - clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "mx2-camera.0"); >> >> + clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "imx27-camera.0"); >> >> + clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "imx27-camera.0"); >> >> clk_register_clkdev(clk[emma_ahb_gate], "ahb", "m2m-emmaprp.0"); >> >> clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0"); >> >> clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL); >> >> diff --git a/arch/arm/mach-imx/devices/devices-common.h b/arch/arm/mach-imx/devices/devices-common.h >> >> index 7f2698c..8112a1a 100644 >> >> --- a/arch/arm/mach-imx/devices/devices-common.h >> >> +++ b/arch/arm/mach-imx/devices/devices-common.h >> >> @@ -202,6 +202,7 @@ struct platform_device *__init imx_add_mx3_sdc_fb( >> >> >> >> #include <linux/platform_data/camera-mx2.h> >> >> struct imx_mx2_camera_data { >> >> + const char *devid; >> >> resource_size_t iobasecsi; >> >> resource_size_t iosizecsi; >> >> resource_size_t irqcsi; >> >> diff --git a/arch/arm/mach-imx/devices/platform-mx2-camera.c b/arch/arm/mach-imx/devices/platform-mx2-camera.c >> >> index 9ad5b2d..b88877d 100644 >> >> --- a/arch/arm/mach-imx/devices/platform-mx2-camera.c >> >> +++ b/arch/arm/mach-imx/devices/platform-mx2-camera.c >> >> @@ -9,14 +9,16 @@ >> >> #include <mach/hardware.h> >> >> #include "devices-common.h" >> >> >> >> -#define imx_mx2_camera_data_entry_single(soc) \ >> >> +#define imx_mx2_camera_data_entry_single(soc, _devid) \ >> >> { \ >> >> + .devid = _devid, \ >> >> .iobasecsi = soc ## _CSI_BASE_ADDR, \ >> >> .iosizecsi = SZ_4K, \ >> >> .irqcsi = soc ## _INT_CSI, \ >> >> } >> >> -#define imx_mx2_camera_data_entry_single_emma(soc) \ >> >> +#define imx_mx2_camera_data_entry_single_emma(soc, _devid) \ >> >> { \ >> >> + .devid = _devid, \ >> >> .iobasecsi = soc ## _CSI_BASE_ADDR, \ >> >> .iosizecsi = SZ_32, \ >> >> .irqcsi = soc ## _INT_CSI, \ >> >> @@ -27,12 +29,12 @@ >> >> >> >> #ifdef CONFIG_SOC_IMX25 >> >> const struct imx_mx2_camera_data imx25_mx2_camera_data __initconst = >> >> - imx_mx2_camera_data_entry_single(MX25); >> >> + imx_mx2_camera_data_entry_single(MX25, "imx25-camera"); >> >> #endif /* ifdef CONFIG_SOC_IMX25 */ >> >> >> >> #ifdef CONFIG_SOC_IMX27 >> >> const struct imx_mx2_camera_data imx27_mx2_camera_data __initconst = >> >> - imx_mx2_camera_data_entry_single_emma(MX27); >> >> + imx_mx2_camera_data_entry_single_emma(MX27, "imx27-camera"); >> >> #endif /* ifdef CONFIG_SOC_IMX27 */ >> >> >> >> struct platform_device *__init imx_add_mx2_camera( >> >> @@ -58,7 +60,7 @@ struct platform_device *__init imx_add_mx2_camera( >> >> .flags = IORESOURCE_IRQ, >> >> }, >> >> }; >> >> - return imx_add_platform_device_dmamask("mx2-camera", 0, >> >> + return imx_add_platform_device_dmamask(data->devid, 0, >> >> res, data->iobaseemmaprp ? 4 : 2, >> >> pdata, sizeof(*pdata), DMA_BIT_MASK(32)); >> >> } >> >> diff --git a/drivers/media/video/mx2_camera.c b/drivers/media/video/mx2_camera.c >> >> index fe4c76c..cde3374 100644 >> >> --- a/drivers/media/video/mx2_camera.c >> >> +++ b/drivers/media/video/mx2_camera.c >> >> @@ -41,7 +41,6 @@ >> >> #include <linux/videodev2.h> >> >> >> >> #include <linux/platform_data/camera-mx2.h> >> >> -#include <mach/hardware.h> >> >> >> >> #include <asm/dma.h> >> >> >> >> @@ -121,11 +120,13 @@ >> >> >> >> #define CSICR1 0x00 >> >> #define CSICR2 0x04 >> >> -#define CSISR (cpu_is_mx27() ? 0x08 : 0x18) >> >> +#define CSISR_IMX25 0x18 >> >> +#define CSISR_IMX27 0x08 >> >> #define CSISTATFIFO 0x0c >> >> #define CSIRFIFO 0x10 >> >> #define CSIRXCNT 0x14 >> >> -#define CSICR3 (cpu_is_mx27() ? 0x1C : 0x08) >> >> +#define CSICR3_IMX25 0x08 >> >> +#define CSICR3_IMX27 0x1c >> >> #define CSIDMASA_STATFIFO 0x20 >> >> #define CSIDMATA_STATFIFO 0x24 >> >> #define CSIDMASA_FB1 0x28 >> >> @@ -268,6 +269,11 @@ struct mx2_buffer { >> >> struct mx2_buf_internal internal; >> >> }; >> >> >> >> +enum mx2_camera_type { >> >> + IMX25_CAMERA, >> >> + IMX27_CAMERA, >> >> +}; >> >> + >> >> struct mx2_camera_dev { >> >> struct device *dev; >> >> struct soc_camera_host soc_host; >> >> @@ -291,6 +297,9 @@ struct mx2_camera_dev { >> >> struct mx2_buffer *fb2_active; >> >> >> >> u32 csicr1; >> >> + u32 reg_csisr; >> >> + u32 reg_csicr3; >> >> + enum mx2_camera_type devtype; >> >> >> >> struct mx2_buf_internal buf_discard[2]; >> >> void *discard_buffer; >> >> @@ -303,6 +312,29 @@ struct mx2_camera_dev { >> >> struct vb2_alloc_ctx *alloc_ctx; >> >> }; >> >> >> >> +static struct platform_device_id mx2_camera_devtype[] = { >> >> + { >> >> + .name = "imx25-camera", >> >> + .driver_data = IMX25_CAMERA, >> >> + }, { >> >> + .name = "imx27-camera", >> >> + .driver_data = IMX27_CAMERA, >> >> + }, { >> >> + /* sentinel */ >> >> + } >> >> +}; >> >> +MODULE_DEVICE_TABLE(platform, mx2_camera_devtype); >> >> + >> >> +static inline int is_imx25_camera(struct mx2_camera_dev *pcdev) >> >> +{ >> >> + return pcdev->devtype == IMX25_CAMERA; >> >> +} >> >> + >> >> +static inline int is_imx27_camera(struct mx2_camera_dev *pcdev) >> >> +{ >> >> + return pcdev->devtype == IMX27_CAMERA; >> >> +} >> >> + >> >> static struct mx2_buffer *mx2_ibuf_to_buf(struct mx2_buf_internal *int_buf) >> >> { >> >> return container_of(int_buf, struct mx2_buffer, internal); >> >> @@ -406,9 +438,9 @@ static void mx2_camera_deactivate(struct mx2_camera_dev *pcdev) >> >> >> >> clk_disable_unprepare(pcdev->clk_csi); >> >> writel(0, pcdev->base_csi + CSICR1); >> >> - if (cpu_is_mx27()) { >> >> + if (is_imx27_camera(pcdev)) { >> >> writel(0, pcdev->base_emma + PRP_CNTL); >> >> - } else if (cpu_is_mx25()) { >> >> + } else if (is_imx25_camera(pcdev)) { >> >> spin_lock_irqsave(&pcdev->lock, flags); >> >> pcdev->fb1_active = NULL; >> >> pcdev->fb2_active = NULL; >> >> @@ -438,7 +470,7 @@ static int mx2_camera_add_device(struct soc_camera_device *icd) >> >> >> >> csicr1 = CSICR1_MCLKEN; >> >> >> >> - if (cpu_is_mx27()) >> >> + if (is_imx27_camera(pcdev)) >> >> csicr1 |= CSICR1_PRP_IF_EN | CSICR1_FCC | >> >> CSICR1_RXFF_LEVEL(0); >> >> >> >> @@ -514,7 +546,7 @@ out: >> >> static irqreturn_t mx25_camera_irq(int irq_csi, void *data) >> >> { >> >> struct mx2_camera_dev *pcdev = data; >> >> - u32 status = readl(pcdev->base_csi + CSISR); >> >> + u32 status = readl(pcdev->base_csi + pcdev->reg_csisr); >> >> >> >> if (status & CSISR_DMA_TSF_FB1_INT) >> >> mx25_camera_frame_done(pcdev, 1, MX2_STATE_DONE); >> >> @@ -523,7 +555,7 @@ static irqreturn_t mx25_camera_irq(int irq_csi, void *data) >> >> >> >> /* FIXME: handle CSISR_RFF_OR_INT */ >> >> >> >> - writel(status, pcdev->base_csi + CSISR); >> >> + writel(status, pcdev->base_csi + pcdev->reg_csisr); >> >> >> >> return IRQ_HANDLED; >> >> } >> >> @@ -608,7 +640,7 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) >> >> buf->state = MX2_STATE_QUEUED; >> >> list_add_tail(&buf->internal.queue, &pcdev->capture); >> >> >> >> - if (cpu_is_mx25()) { >> >> + if (is_imx25_camera(pcdev)) { >> >> u32 csicr3, dma_inten = 0; >> >> >> >> if (pcdev->fb1_active == NULL) { >> >> @@ -627,20 +659,20 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) >> >> list_del(&buf->internal.queue); >> >> buf->state = MX2_STATE_ACTIVE; >> >> >> >> - csicr3 = readl(pcdev->base_csi + CSICR3); >> >> + csicr3 = readl(pcdev->base_csi + pcdev->reg_csicr3); >> >> >> >> /* Reflash DMA */ >> >> writel(csicr3 | CSICR3_DMA_REFLASH_RFF, >> >> - pcdev->base_csi + CSICR3); >> >> + pcdev->base_csi + pcdev->reg_csicr3); >> >> >> >> /* clear & enable interrupts */ >> >> - writel(dma_inten, pcdev->base_csi + CSISR); >> >> + writel(dma_inten, pcdev->base_csi + pcdev->reg_csisr); >> >> pcdev->csicr1 |= dma_inten; >> >> writel(pcdev->csicr1, pcdev->base_csi + CSICR1); >> >> >> >> /* enable DMA */ >> >> csicr3 |= CSICR3_DMA_REQ_EN_RFF | CSICR3_RXFF_LEVEL(1); >> >> - writel(csicr3, pcdev->base_csi + CSICR3); >> >> + writel(csicr3, pcdev->base_csi + pcdev->reg_csicr3); >> >> } >> >> } >> >> >> >> @@ -684,7 +716,7 @@ static void mx2_videobuf_release(struct vb2_buffer *vb) >> >> */ >> >> >> >> spin_lock_irqsave(&pcdev->lock, flags); >> >> - if (cpu_is_mx25() && buf->state == MX2_STATE_ACTIVE) { >> >> + if (is_imx25_camera(pcdev) && buf->state == MX2_STATE_ACTIVE) { >> >> if (pcdev->fb1_active == buf) { >> >> pcdev->csicr1 &= ~CSICR1_FB1_DMA_INTEN; >> >> writel(0, pcdev->base_csi + CSIDMASA_FB1); >> >> @@ -807,7 +839,7 @@ static int mx2_start_streaming(struct vb2_queue *q, unsigned int count) >> >> unsigned long phys; >> >> int bytesperline; >> >> >> >> - if (cpu_is_mx27()) { >> >> + if (is_imx27_camera(pcdev)) { >> >> unsigned long flags; >> >> if (count < 2) >> >> return -EINVAL; >> >> @@ -902,7 +934,7 @@ static int mx2_stop_streaming(struct vb2_queue *q) >> >> void *b; >> >> u32 cntl; >> >> >> >> - if (cpu_is_mx27()) { >> >> + if (is_imx27_camera(pcdev)) { >> >> spin_lock_irqsave(&pcdev->lock, flags); >> >> >> >> cntl = readl(pcdev->base_emma + PRP_CNTL); >> >> @@ -1054,11 +1086,11 @@ static int mx2_camera_set_bus_param(struct soc_camera_device *icd) >> >> if (bytesperline < 0) >> >> return bytesperline; >> >> >> >> - if (cpu_is_mx27()) { >> >> + if (is_imx27_camera(pcdev)) { >> >> ret = mx27_camera_emma_prp_reset(pcdev); >> >> if (ret) >> >> return ret; >> >> - } else if (cpu_is_mx25()) { >> >> + } else if (is_imx25_camera(pcdev)) { >> >> writel((bytesperline * icd->user_height) >> 2, >> >> pcdev->base_csi + CSIRXCNT); >> >> writel((bytesperline << 16) | icd->user_height, >> >> @@ -1351,7 +1383,7 @@ static int mx2_camera_try_fmt(struct soc_camera_device *icd, >> >> /* FIXME: implement MX27 limits */ >> >> >> >> /* limit to MX25 hardware capabilities */ >> >> - if (cpu_is_mx25()) { >> >> + if (is_imx25_camera(pcdev)) { >> >> if (xlate->host_fmt->bits_per_sample <= 8) >> >> width_limit = 0xffff * 4; >> >> else >> >> @@ -1685,6 +1717,20 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >> >> goto exit; >> >> } >> >> >> >> + pcdev->devtype = pdev->id_entry->driver_data; >> >> + switch (pcdev->devtype) { >> >> + case IMX25_CAMERA: >> >> + pcdev->reg_csisr = CSISR_IMX25; >> >> + pcdev->reg_csicr3 = CSICR3_IMX25; >> >> + break; >> >> + case IMX27_CAMERA: >> >> + pcdev->reg_csisr = CSISR_IMX27; >> >> + pcdev->reg_csicr3 = CSICR3_IMX27; >> >> + break; >> >> + default: >> >> + break; >> >> + } >> >> + >> >> pcdev->clk_csi = devm_clk_get(&pdev->dev, "ahb"); >> >> if (IS_ERR(pcdev->clk_csi)) { >> >> dev_err(&pdev->dev, "Could not get csi clock\n"); >> >> @@ -1722,7 +1768,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >> >> pcdev->dev = &pdev->dev; >> >> platform_set_drvdata(pdev, pcdev); >> >> >> >> - if (cpu_is_mx25()) { >> >> + if (is_imx25_camera(pcdev)) { >> >> err = devm_request_irq(&pdev->dev, irq_csi, mx25_camera_irq, 0, >> >> MX2_CAM_DRV_NAME, pcdev); >> >> if (err) { >> >> @@ -1731,7 +1777,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >> >> } >> >> } >> >> >> >> - if (cpu_is_mx27()) { >> >> + if (is_imx27_camera(pcdev)) { >> >> err = mx27_camera_emma_init(pdev); >> >> if (err) >> >> goto exit; >> >> @@ -1742,7 +1788,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >> >> pcdev->soc_host.priv = pcdev; >> >> pcdev->soc_host.v4l2_dev.dev = &pdev->dev; >> >> pcdev->soc_host.nr = pdev->id; >> >> - if (cpu_is_mx25()) >> >> + if (is_imx25_camera(pcdev)) >> >> pcdev->soc_host.capabilities = SOCAM_HOST_CAP_STRIDE; >> >> >> >> pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); >> >> @@ -1762,7 +1808,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >> >> exit_free_emma: >> >> vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); >> >> eallocctx: >> >> - if (cpu_is_mx27()) { >> >> + if (is_imx27_camera(pcdev)) { >> >> clk_disable_unprepare(pcdev->clk_emma_ipg); >> >> clk_disable_unprepare(pcdev->clk_emma_ahb); >> >> } >> >> @@ -1780,7 +1826,7 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev) >> >> >> >> vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); >> >> >> >> - if (cpu_is_mx27()) { >> >> + if (is_imx27_camera(pcdev)) { >> >> clk_disable_unprepare(pcdev->clk_emma_ipg); >> >> clk_disable_unprepare(pcdev->clk_emma_ahb); >> >> } >> >> @@ -1794,6 +1840,7 @@ static struct platform_driver mx2_camera_driver = { >> >> .driver = { >> >> .name = MX2_CAM_DRV_NAME, >> >> }, >> >> + .id_table = mx2_camera_devtype, >> >> .remove = __devexit_p(mx2_camera_remove), >> >> }; >> >> >> >> -- >> >> 1.7.9.5 >> >> I can't test this patch because it depends heavily on the previous >> one, which breaks the driver. >> >> Regards. >> >> -- >> Javier Martin >> Vista Silicon S.L. >> CDTUC - FASE C - Oficina S-345 >> Avda de los Castros s/n >> 39005- Santander. Cantabria. Spain >> +34 942 25 32 60 >> www.vista-silicon.com >> > > --- > Guennadi Liakhovetski, Ph.D. > Freelance Open-Source Software Developer > http://www.open-technology.de/ > -- > To unsubscribe from this list: send the line "unsubscribe linux-media" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html
Em 18-09-2012 05:35, javier Martin escreveu: > On 17 September 2012 15:59, Guennadi Liakhovetski <g.liakhovetski@gmx.de> wrote: >> On Mon, 17 Sep 2012, javier Martin wrote: >> >>> Hi Shawn, >>> >>> On 17 September 2012 11:21, Guennadi Liakhovetski <g.liakhovetski@gmx.de> wrote: >>>> On Mon, 17 Sep 2012, Shawn Guo wrote: >>>> >>>>> It changes the driver to use platform_device_id rather than cpu_is_xxx >>>>> to determine the controller type, and updates the platform code >>>>> accordingly. >>>>> >>>>> As the result, mach/hardware.h inclusion gets removed from the driver. >>>>> >>>>> Signed-off-by: Shawn Guo <shawn.guo@linaro.org> >>>>> Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de> >>>>> Cc: linux-media@vger.kernel.org >>>> > > Tested-by: Javier Martin <javier.martin@vista-silicon.com> I'm understanding that this patch will flow through arm tree[1]. So: Acked-by: Mauro Carvalho Chehab <mchehab@redhat.com> [1] if you understand otherwise, I can apply it via my tree as well > >>>> Acked-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> >>> >>> i.MX25 support is broken and is scheduled for removal. >> >> It is not yet, I haven't pushed those your patches yet. >> >> Thanks >> Guennadi >> >>> I think we should not keep on trying to maintain it. Couldn't we just >>> drop it? It only makes maintenance tasks more difficult. >>> >>>> Thanks >>>> Guennadi >>>> >>>>> --- >>>>> arch/arm/mach-imx/clk-imx25.c | 6 +- >>>>> arch/arm/mach-imx/clk-imx27.c | 6 +- >>>>> arch/arm/mach-imx/devices/devices-common.h | 1 + >>>>> arch/arm/mach-imx/devices/platform-mx2-camera.c | 12 +-- >>>>> drivers/media/video/mx2_camera.c | 95 +++++++++++++++++------ >>>>> 5 files changed, 85 insertions(+), 35 deletions(-) >>>>> >>>>> diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c >>>>> index 1aea073..71fe521 100644 >>>>> --- a/arch/arm/mach-imx/clk-imx25.c >>>>> +++ b/arch/arm/mach-imx/clk-imx25.c >>>>> @@ -231,9 +231,9 @@ int __init mx25_clocks_init(void) >>>>> clk_register_clkdev(clk[esdhc2_ipg_per], "per", "sdhci-esdhc-imx25.1"); >>>>> clk_register_clkdev(clk[esdhc2_ipg], "ipg", "sdhci-esdhc-imx25.1"); >>>>> clk_register_clkdev(clk[esdhc2_ahb], "ahb", "sdhci-esdhc-imx25.1"); >>>>> - clk_register_clkdev(clk[csi_ipg_per], "per", "mx2-camera.0"); >>>>> - clk_register_clkdev(clk[csi_ipg], "ipg", "mx2-camera.0"); >>>>> - clk_register_clkdev(clk[csi_ahb], "ahb", "mx2-camera.0"); >>>>> + clk_register_clkdev(clk[csi_ipg_per], "per", "imx25-camera.0"); >>>>> + clk_register_clkdev(clk[csi_ipg], "ipg", "imx25-camera.0"); >>>>> + clk_register_clkdev(clk[csi_ahb], "ahb", "imx25-camera.0"); >>>>> clk_register_clkdev(clk[dummy], "audmux", NULL); >>>>> clk_register_clkdev(clk[can1_ipg], NULL, "flexcan.0"); >>>>> clk_register_clkdev(clk[can2_ipg], NULL, "flexcan.1"); >>>>> diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c >>>>> index 5ff5cf0..e26de52 100644 >>>>> --- a/arch/arm/mach-imx/clk-imx27.c >>>>> +++ b/arch/arm/mach-imx/clk-imx27.c >>>>> @@ -224,7 +224,7 @@ int __init mx27_clocks_init(unsigned long fref) >>>>> clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0"); >>>>> clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); >>>>> clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0"); >>>>> - clk_register_clkdev(clk[csi_ahb_gate], "ahb", "mx2-camera.0"); >>>>> + clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0"); >>>>> clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); >>>>> clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); >>>>> clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc"); >>>>> @@ -251,8 +251,8 @@ int __init mx27_clocks_init(unsigned long fref) >>>>> clk_register_clkdev(clk[i2c2_ipg_gate], NULL, "imx21-i2c.1"); >>>>> clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0"); >>>>> clk_register_clkdev(clk[kpp_ipg_gate], NULL, "imx-keypad"); >>>>> - clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "mx2-camera.0"); >>>>> - clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "mx2-camera.0"); >>>>> + clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "imx27-camera.0"); >>>>> + clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "imx27-camera.0"); >>>>> clk_register_clkdev(clk[emma_ahb_gate], "ahb", "m2m-emmaprp.0"); >>>>> clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0"); >>>>> clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL); >>>>> diff --git a/arch/arm/mach-imx/devices/devices-common.h b/arch/arm/mach-imx/devices/devices-common.h >>>>> index 7f2698c..8112a1a 100644 >>>>> --- a/arch/arm/mach-imx/devices/devices-common.h >>>>> +++ b/arch/arm/mach-imx/devices/devices-common.h >>>>> @@ -202,6 +202,7 @@ struct platform_device *__init imx_add_mx3_sdc_fb( >>>>> >>>>> #include <linux/platform_data/camera-mx2.h> >>>>> struct imx_mx2_camera_data { >>>>> + const char *devid; >>>>> resource_size_t iobasecsi; >>>>> resource_size_t iosizecsi; >>>>> resource_size_t irqcsi; >>>>> diff --git a/arch/arm/mach-imx/devices/platform-mx2-camera.c b/arch/arm/mach-imx/devices/platform-mx2-camera.c >>>>> index 9ad5b2d..b88877d 100644 >>>>> --- a/arch/arm/mach-imx/devices/platform-mx2-camera.c >>>>> +++ b/arch/arm/mach-imx/devices/platform-mx2-camera.c >>>>> @@ -9,14 +9,16 @@ >>>>> #include <mach/hardware.h> >>>>> #include "devices-common.h" >>>>> >>>>> -#define imx_mx2_camera_data_entry_single(soc) \ >>>>> +#define imx_mx2_camera_data_entry_single(soc, _devid) \ >>>>> { \ >>>>> + .devid = _devid, \ >>>>> .iobasecsi = soc ## _CSI_BASE_ADDR, \ >>>>> .iosizecsi = SZ_4K, \ >>>>> .irqcsi = soc ## _INT_CSI, \ >>>>> } >>>>> -#define imx_mx2_camera_data_entry_single_emma(soc) \ >>>>> +#define imx_mx2_camera_data_entry_single_emma(soc, _devid) \ >>>>> { \ >>>>> + .devid = _devid, \ >>>>> .iobasecsi = soc ## _CSI_BASE_ADDR, \ >>>>> .iosizecsi = SZ_32, \ >>>>> .irqcsi = soc ## _INT_CSI, \ >>>>> @@ -27,12 +29,12 @@ >>>>> >>>>> #ifdef CONFIG_SOC_IMX25 >>>>> const struct imx_mx2_camera_data imx25_mx2_camera_data __initconst = >>>>> - imx_mx2_camera_data_entry_single(MX25); >>>>> + imx_mx2_camera_data_entry_single(MX25, "imx25-camera"); >>>>> #endif /* ifdef CONFIG_SOC_IMX25 */ >>>>> >>>>> #ifdef CONFIG_SOC_IMX27 >>>>> const struct imx_mx2_camera_data imx27_mx2_camera_data __initconst = >>>>> - imx_mx2_camera_data_entry_single_emma(MX27); >>>>> + imx_mx2_camera_data_entry_single_emma(MX27, "imx27-camera"); >>>>> #endif /* ifdef CONFIG_SOC_IMX27 */ >>>>> >>>>> struct platform_device *__init imx_add_mx2_camera( >>>>> @@ -58,7 +60,7 @@ struct platform_device *__init imx_add_mx2_camera( >>>>> .flags = IORESOURCE_IRQ, >>>>> }, >>>>> }; >>>>> - return imx_add_platform_device_dmamask("mx2-camera", 0, >>>>> + return imx_add_platform_device_dmamask(data->devid, 0, >>>>> res, data->iobaseemmaprp ? 4 : 2, >>>>> pdata, sizeof(*pdata), DMA_BIT_MASK(32)); >>>>> } >>>>> diff --git a/drivers/media/video/mx2_camera.c b/drivers/media/video/mx2_camera.c >>>>> index fe4c76c..cde3374 100644 >>>>> --- a/drivers/media/video/mx2_camera.c >>>>> +++ b/drivers/media/video/mx2_camera.c >>>>> @@ -41,7 +41,6 @@ >>>>> #include <linux/videodev2.h> >>>>> >>>>> #include <linux/platform_data/camera-mx2.h> >>>>> -#include <mach/hardware.h> >>>>> >>>>> #include <asm/dma.h> >>>>> >>>>> @@ -121,11 +120,13 @@ >>>>> >>>>> #define CSICR1 0x00 >>>>> #define CSICR2 0x04 >>>>> -#define CSISR (cpu_is_mx27() ? 0x08 : 0x18) >>>>> +#define CSISR_IMX25 0x18 >>>>> +#define CSISR_IMX27 0x08 >>>>> #define CSISTATFIFO 0x0c >>>>> #define CSIRFIFO 0x10 >>>>> #define CSIRXCNT 0x14 >>>>> -#define CSICR3 (cpu_is_mx27() ? 0x1C : 0x08) >>>>> +#define CSICR3_IMX25 0x08 >>>>> +#define CSICR3_IMX27 0x1c >>>>> #define CSIDMASA_STATFIFO 0x20 >>>>> #define CSIDMATA_STATFIFO 0x24 >>>>> #define CSIDMASA_FB1 0x28 >>>>> @@ -268,6 +269,11 @@ struct mx2_buffer { >>>>> struct mx2_buf_internal internal; >>>>> }; >>>>> >>>>> +enum mx2_camera_type { >>>>> + IMX25_CAMERA, >>>>> + IMX27_CAMERA, >>>>> +}; >>>>> + >>>>> struct mx2_camera_dev { >>>>> struct device *dev; >>>>> struct soc_camera_host soc_host; >>>>> @@ -291,6 +297,9 @@ struct mx2_camera_dev { >>>>> struct mx2_buffer *fb2_active; >>>>> >>>>> u32 csicr1; >>>>> + u32 reg_csisr; >>>>> + u32 reg_csicr3; >>>>> + enum mx2_camera_type devtype; >>>>> >>>>> struct mx2_buf_internal buf_discard[2]; >>>>> void *discard_buffer; >>>>> @@ -303,6 +312,29 @@ struct mx2_camera_dev { >>>>> struct vb2_alloc_ctx *alloc_ctx; >>>>> }; >>>>> >>>>> +static struct platform_device_id mx2_camera_devtype[] = { >>>>> + { >>>>> + .name = "imx25-camera", >>>>> + .driver_data = IMX25_CAMERA, >>>>> + }, { >>>>> + .name = "imx27-camera", >>>>> + .driver_data = IMX27_CAMERA, >>>>> + }, { >>>>> + /* sentinel */ >>>>> + } >>>>> +}; >>>>> +MODULE_DEVICE_TABLE(platform, mx2_camera_devtype); >>>>> + >>>>> +static inline int is_imx25_camera(struct mx2_camera_dev *pcdev) >>>>> +{ >>>>> + return pcdev->devtype == IMX25_CAMERA; >>>>> +} >>>>> + >>>>> +static inline int is_imx27_camera(struct mx2_camera_dev *pcdev) >>>>> +{ >>>>> + return pcdev->devtype == IMX27_CAMERA; >>>>> +} >>>>> + >>>>> static struct mx2_buffer *mx2_ibuf_to_buf(struct mx2_buf_internal *int_buf) >>>>> { >>>>> return container_of(int_buf, struct mx2_buffer, internal); >>>>> @@ -406,9 +438,9 @@ static void mx2_camera_deactivate(struct mx2_camera_dev *pcdev) >>>>> >>>>> clk_disable_unprepare(pcdev->clk_csi); >>>>> writel(0, pcdev->base_csi + CSICR1); >>>>> - if (cpu_is_mx27()) { >>>>> + if (is_imx27_camera(pcdev)) { >>>>> writel(0, pcdev->base_emma + PRP_CNTL); >>>>> - } else if (cpu_is_mx25()) { >>>>> + } else if (is_imx25_camera(pcdev)) { >>>>> spin_lock_irqsave(&pcdev->lock, flags); >>>>> pcdev->fb1_active = NULL; >>>>> pcdev->fb2_active = NULL; >>>>> @@ -438,7 +470,7 @@ static int mx2_camera_add_device(struct soc_camera_device *icd) >>>>> >>>>> csicr1 = CSICR1_MCLKEN; >>>>> >>>>> - if (cpu_is_mx27()) >>>>> + if (is_imx27_camera(pcdev)) >>>>> csicr1 |= CSICR1_PRP_IF_EN | CSICR1_FCC | >>>>> CSICR1_RXFF_LEVEL(0); >>>>> >>>>> @@ -514,7 +546,7 @@ out: >>>>> static irqreturn_t mx25_camera_irq(int irq_csi, void *data) >>>>> { >>>>> struct mx2_camera_dev *pcdev = data; >>>>> - u32 status = readl(pcdev->base_csi + CSISR); >>>>> + u32 status = readl(pcdev->base_csi + pcdev->reg_csisr); >>>>> >>>>> if (status & CSISR_DMA_TSF_FB1_INT) >>>>> mx25_camera_frame_done(pcdev, 1, MX2_STATE_DONE); >>>>> @@ -523,7 +555,7 @@ static irqreturn_t mx25_camera_irq(int irq_csi, void *data) >>>>> >>>>> /* FIXME: handle CSISR_RFF_OR_INT */ >>>>> >>>>> - writel(status, pcdev->base_csi + CSISR); >>>>> + writel(status, pcdev->base_csi + pcdev->reg_csisr); >>>>> >>>>> return IRQ_HANDLED; >>>>> } >>>>> @@ -608,7 +640,7 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) >>>>> buf->state = MX2_STATE_QUEUED; >>>>> list_add_tail(&buf->internal.queue, &pcdev->capture); >>>>> >>>>> - if (cpu_is_mx25()) { >>>>> + if (is_imx25_camera(pcdev)) { >>>>> u32 csicr3, dma_inten = 0; >>>>> >>>>> if (pcdev->fb1_active == NULL) { >>>>> @@ -627,20 +659,20 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) >>>>> list_del(&buf->internal.queue); >>>>> buf->state = MX2_STATE_ACTIVE; >>>>> >>>>> - csicr3 = readl(pcdev->base_csi + CSICR3); >>>>> + csicr3 = readl(pcdev->base_csi + pcdev->reg_csicr3); >>>>> >>>>> /* Reflash DMA */ >>>>> writel(csicr3 | CSICR3_DMA_REFLASH_RFF, >>>>> - pcdev->base_csi + CSICR3); >>>>> + pcdev->base_csi + pcdev->reg_csicr3); >>>>> >>>>> /* clear & enable interrupts */ >>>>> - writel(dma_inten, pcdev->base_csi + CSISR); >>>>> + writel(dma_inten, pcdev->base_csi + pcdev->reg_csisr); >>>>> pcdev->csicr1 |= dma_inten; >>>>> writel(pcdev->csicr1, pcdev->base_csi + CSICR1); >>>>> >>>>> /* enable DMA */ >>>>> csicr3 |= CSICR3_DMA_REQ_EN_RFF | CSICR3_RXFF_LEVEL(1); >>>>> - writel(csicr3, pcdev->base_csi + CSICR3); >>>>> + writel(csicr3, pcdev->base_csi + pcdev->reg_csicr3); >>>>> } >>>>> } >>>>> >>>>> @@ -684,7 +716,7 @@ static void mx2_videobuf_release(struct vb2_buffer *vb) >>>>> */ >>>>> >>>>> spin_lock_irqsave(&pcdev->lock, flags); >>>>> - if (cpu_is_mx25() && buf->state == MX2_STATE_ACTIVE) { >>>>> + if (is_imx25_camera(pcdev) && buf->state == MX2_STATE_ACTIVE) { >>>>> if (pcdev->fb1_active == buf) { >>>>> pcdev->csicr1 &= ~CSICR1_FB1_DMA_INTEN; >>>>> writel(0, pcdev->base_csi + CSIDMASA_FB1); >>>>> @@ -807,7 +839,7 @@ static int mx2_start_streaming(struct vb2_queue *q, unsigned int count) >>>>> unsigned long phys; >>>>> int bytesperline; >>>>> >>>>> - if (cpu_is_mx27()) { >>>>> + if (is_imx27_camera(pcdev)) { >>>>> unsigned long flags; >>>>> if (count < 2) >>>>> return -EINVAL; >>>>> @@ -902,7 +934,7 @@ static int mx2_stop_streaming(struct vb2_queue *q) >>>>> void *b; >>>>> u32 cntl; >>>>> >>>>> - if (cpu_is_mx27()) { >>>>> + if (is_imx27_camera(pcdev)) { >>>>> spin_lock_irqsave(&pcdev->lock, flags); >>>>> >>>>> cntl = readl(pcdev->base_emma + PRP_CNTL); >>>>> @@ -1054,11 +1086,11 @@ static int mx2_camera_set_bus_param(struct soc_camera_device *icd) >>>>> if (bytesperline < 0) >>>>> return bytesperline; >>>>> >>>>> - if (cpu_is_mx27()) { >>>>> + if (is_imx27_camera(pcdev)) { >>>>> ret = mx27_camera_emma_prp_reset(pcdev); >>>>> if (ret) >>>>> return ret; >>>>> - } else if (cpu_is_mx25()) { >>>>> + } else if (is_imx25_camera(pcdev)) { >>>>> writel((bytesperline * icd->user_height) >> 2, >>>>> pcdev->base_csi + CSIRXCNT); >>>>> writel((bytesperline << 16) | icd->user_height, >>>>> @@ -1351,7 +1383,7 @@ static int mx2_camera_try_fmt(struct soc_camera_device *icd, >>>>> /* FIXME: implement MX27 limits */ >>>>> >>>>> /* limit to MX25 hardware capabilities */ >>>>> - if (cpu_is_mx25()) { >>>>> + if (is_imx25_camera(pcdev)) { >>>>> if (xlate->host_fmt->bits_per_sample <= 8) >>>>> width_limit = 0xffff * 4; >>>>> else >>>>> @@ -1685,6 +1717,20 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >>>>> goto exit; >>>>> } >>>>> >>>>> + pcdev->devtype = pdev->id_entry->driver_data; >>>>> + switch (pcdev->devtype) { >>>>> + case IMX25_CAMERA: >>>>> + pcdev->reg_csisr = CSISR_IMX25; >>>>> + pcdev->reg_csicr3 = CSICR3_IMX25; >>>>> + break; >>>>> + case IMX27_CAMERA: >>>>> + pcdev->reg_csisr = CSISR_IMX27; >>>>> + pcdev->reg_csicr3 = CSICR3_IMX27; >>>>> + break; >>>>> + default: >>>>> + break; >>>>> + } >>>>> + >>>>> pcdev->clk_csi = devm_clk_get(&pdev->dev, "ahb"); >>>>> if (IS_ERR(pcdev->clk_csi)) { >>>>> dev_err(&pdev->dev, "Could not get csi clock\n"); >>>>> @@ -1722,7 +1768,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >>>>> pcdev->dev = &pdev->dev; >>>>> platform_set_drvdata(pdev, pcdev); >>>>> >>>>> - if (cpu_is_mx25()) { >>>>> + if (is_imx25_camera(pcdev)) { >>>>> err = devm_request_irq(&pdev->dev, irq_csi, mx25_camera_irq, 0, >>>>> MX2_CAM_DRV_NAME, pcdev); >>>>> if (err) { >>>>> @@ -1731,7 +1777,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >>>>> } >>>>> } >>>>> >>>>> - if (cpu_is_mx27()) { >>>>> + if (is_imx27_camera(pcdev)) { >>>>> err = mx27_camera_emma_init(pdev); >>>>> if (err) >>>>> goto exit; >>>>> @@ -1742,7 +1788,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >>>>> pcdev->soc_host.priv = pcdev; >>>>> pcdev->soc_host.v4l2_dev.dev = &pdev->dev; >>>>> pcdev->soc_host.nr = pdev->id; >>>>> - if (cpu_is_mx25()) >>>>> + if (is_imx25_camera(pcdev)) >>>>> pcdev->soc_host.capabilities = SOCAM_HOST_CAP_STRIDE; >>>>> >>>>> pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); >>>>> @@ -1762,7 +1808,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) >>>>> exit_free_emma: >>>>> vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); >>>>> eallocctx: >>>>> - if (cpu_is_mx27()) { >>>>> + if (is_imx27_camera(pcdev)) { >>>>> clk_disable_unprepare(pcdev->clk_emma_ipg); >>>>> clk_disable_unprepare(pcdev->clk_emma_ahb); >>>>> } >>>>> @@ -1780,7 +1826,7 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev) >>>>> >>>>> vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); >>>>> >>>>> - if (cpu_is_mx27()) { >>>>> + if (is_imx27_camera(pcdev)) { >>>>> clk_disable_unprepare(pcdev->clk_emma_ipg); >>>>> clk_disable_unprepare(pcdev->clk_emma_ahb); >>>>> } >>>>> @@ -1794,6 +1840,7 @@ static struct platform_driver mx2_camera_driver = { >>>>> .driver = { >>>>> .name = MX2_CAM_DRV_NAME, >>>>> }, >>>>> + .id_table = mx2_camera_devtype, >>>>> .remove = __devexit_p(mx2_camera_remove), >>>>> }; >>>>> >>>>> -- >>>>> 1.7.9.5 >>> >>> I can't test this patch because it depends heavily on the previous >>> one, which breaks the driver. >>> >>> Regards. >>> >>> -- >>> Javier Martin >>> Vista Silicon S.L. >>> CDTUC - FASE C - Oficina S-345 >>> Avda de los Castros s/n >>> 39005- Santander. Cantabria. Spain >>> +34 942 25 32 60 >>> www.vista-silicon.com >>> >> >> --- >> Guennadi Liakhovetski, Ph.D. >> Freelance Open-Source Software Developer >> http://www.open-technology.de/ >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-media" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > >
On Thu, Sep 27, 2012 at 04:36:56AM -0300, Mauro Carvalho Chehab wrote: > I'm understanding that this patch will flow through arm tree[1]. So: Yes, it will go through arm-soc tree for 3.8. > Acked-by: Mauro Carvalho Chehab <mchehab@redhat.com> > Thanks, Mauro. Shawn
diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c index 1aea073..71fe521 100644 --- a/arch/arm/mach-imx/clk-imx25.c +++ b/arch/arm/mach-imx/clk-imx25.c @@ -231,9 +231,9 @@ int __init mx25_clocks_init(void) clk_register_clkdev(clk[esdhc2_ipg_per], "per", "sdhci-esdhc-imx25.1"); clk_register_clkdev(clk[esdhc2_ipg], "ipg", "sdhci-esdhc-imx25.1"); clk_register_clkdev(clk[esdhc2_ahb], "ahb", "sdhci-esdhc-imx25.1"); - clk_register_clkdev(clk[csi_ipg_per], "per", "mx2-camera.0"); - clk_register_clkdev(clk[csi_ipg], "ipg", "mx2-camera.0"); - clk_register_clkdev(clk[csi_ahb], "ahb", "mx2-camera.0"); + clk_register_clkdev(clk[csi_ipg_per], "per", "imx25-camera.0"); + clk_register_clkdev(clk[csi_ipg], "ipg", "imx25-camera.0"); + clk_register_clkdev(clk[csi_ahb], "ahb", "imx25-camera.0"); clk_register_clkdev(clk[dummy], "audmux", NULL); clk_register_clkdev(clk[can1_ipg], NULL, "flexcan.0"); clk_register_clkdev(clk[can2_ipg], NULL, "flexcan.1"); diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c index 5ff5cf0..e26de52 100644 --- a/arch/arm/mach-imx/clk-imx27.c +++ b/arch/arm/mach-imx/clk-imx27.c @@ -224,7 +224,7 @@ int __init mx27_clocks_init(unsigned long fref) clk_register_clkdev(clk[per3_gate], "per", "imx-fb.0"); clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "imx-fb.0"); clk_register_clkdev(clk[lcdc_ahb_gate], "ahb", "imx-fb.0"); - clk_register_clkdev(clk[csi_ahb_gate], "ahb", "mx2-camera.0"); + clk_register_clkdev(clk[csi_ahb_gate], "ahb", "imx27-camera.0"); clk_register_clkdev(clk[usb_div], "per", "fsl-usb2-udc"); clk_register_clkdev(clk[usb_ipg_gate], "ipg", "fsl-usb2-udc"); clk_register_clkdev(clk[usb_ahb_gate], "ahb", "fsl-usb2-udc"); @@ -251,8 +251,8 @@ int __init mx27_clocks_init(unsigned long fref) clk_register_clkdev(clk[i2c2_ipg_gate], NULL, "imx21-i2c.1"); clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0"); clk_register_clkdev(clk[kpp_ipg_gate], NULL, "imx-keypad"); - clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "mx2-camera.0"); - clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "mx2-camera.0"); + clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "imx27-camera.0"); + clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "imx27-camera.0"); clk_register_clkdev(clk[emma_ahb_gate], "ahb", "m2m-emmaprp.0"); clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0"); clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL); diff --git a/arch/arm/mach-imx/devices/devices-common.h b/arch/arm/mach-imx/devices/devices-common.h index 7f2698c..8112a1a 100644 --- a/arch/arm/mach-imx/devices/devices-common.h +++ b/arch/arm/mach-imx/devices/devices-common.h @@ -202,6 +202,7 @@ struct platform_device *__init imx_add_mx3_sdc_fb( #include <linux/platform_data/camera-mx2.h> struct imx_mx2_camera_data { + const char *devid; resource_size_t iobasecsi; resource_size_t iosizecsi; resource_size_t irqcsi; diff --git a/arch/arm/mach-imx/devices/platform-mx2-camera.c b/arch/arm/mach-imx/devices/platform-mx2-camera.c index 9ad5b2d..b88877d 100644 --- a/arch/arm/mach-imx/devices/platform-mx2-camera.c +++ b/arch/arm/mach-imx/devices/platform-mx2-camera.c @@ -9,14 +9,16 @@ #include <mach/hardware.h> #include "devices-common.h" -#define imx_mx2_camera_data_entry_single(soc) \ +#define imx_mx2_camera_data_entry_single(soc, _devid) \ { \ + .devid = _devid, \ .iobasecsi = soc ## _CSI_BASE_ADDR, \ .iosizecsi = SZ_4K, \ .irqcsi = soc ## _INT_CSI, \ } -#define imx_mx2_camera_data_entry_single_emma(soc) \ +#define imx_mx2_camera_data_entry_single_emma(soc, _devid) \ { \ + .devid = _devid, \ .iobasecsi = soc ## _CSI_BASE_ADDR, \ .iosizecsi = SZ_32, \ .irqcsi = soc ## _INT_CSI, \ @@ -27,12 +29,12 @@ #ifdef CONFIG_SOC_IMX25 const struct imx_mx2_camera_data imx25_mx2_camera_data __initconst = - imx_mx2_camera_data_entry_single(MX25); + imx_mx2_camera_data_entry_single(MX25, "imx25-camera"); #endif /* ifdef CONFIG_SOC_IMX25 */ #ifdef CONFIG_SOC_IMX27 const struct imx_mx2_camera_data imx27_mx2_camera_data __initconst = - imx_mx2_camera_data_entry_single_emma(MX27); + imx_mx2_camera_data_entry_single_emma(MX27, "imx27-camera"); #endif /* ifdef CONFIG_SOC_IMX27 */ struct platform_device *__init imx_add_mx2_camera( @@ -58,7 +60,7 @@ struct platform_device *__init imx_add_mx2_camera( .flags = IORESOURCE_IRQ, }, }; - return imx_add_platform_device_dmamask("mx2-camera", 0, + return imx_add_platform_device_dmamask(data->devid, 0, res, data->iobaseemmaprp ? 4 : 2, pdata, sizeof(*pdata), DMA_BIT_MASK(32)); } diff --git a/drivers/media/video/mx2_camera.c b/drivers/media/video/mx2_camera.c index fe4c76c..cde3374 100644 --- a/drivers/media/video/mx2_camera.c +++ b/drivers/media/video/mx2_camera.c @@ -41,7 +41,6 @@ #include <linux/videodev2.h> #include <linux/platform_data/camera-mx2.h> -#include <mach/hardware.h> #include <asm/dma.h> @@ -121,11 +120,13 @@ #define CSICR1 0x00 #define CSICR2 0x04 -#define CSISR (cpu_is_mx27() ? 0x08 : 0x18) +#define CSISR_IMX25 0x18 +#define CSISR_IMX27 0x08 #define CSISTATFIFO 0x0c #define CSIRFIFO 0x10 #define CSIRXCNT 0x14 -#define CSICR3 (cpu_is_mx27() ? 0x1C : 0x08) +#define CSICR3_IMX25 0x08 +#define CSICR3_IMX27 0x1c #define CSIDMASA_STATFIFO 0x20 #define CSIDMATA_STATFIFO 0x24 #define CSIDMASA_FB1 0x28 @@ -268,6 +269,11 @@ struct mx2_buffer { struct mx2_buf_internal internal; }; +enum mx2_camera_type { + IMX25_CAMERA, + IMX27_CAMERA, +}; + struct mx2_camera_dev { struct device *dev; struct soc_camera_host soc_host; @@ -291,6 +297,9 @@ struct mx2_camera_dev { struct mx2_buffer *fb2_active; u32 csicr1; + u32 reg_csisr; + u32 reg_csicr3; + enum mx2_camera_type devtype; struct mx2_buf_internal buf_discard[2]; void *discard_buffer; @@ -303,6 +312,29 @@ struct mx2_camera_dev { struct vb2_alloc_ctx *alloc_ctx; }; +static struct platform_device_id mx2_camera_devtype[] = { + { + .name = "imx25-camera", + .driver_data = IMX25_CAMERA, + }, { + .name = "imx27-camera", + .driver_data = IMX27_CAMERA, + }, { + /* sentinel */ + } +}; +MODULE_DEVICE_TABLE(platform, mx2_camera_devtype); + +static inline int is_imx25_camera(struct mx2_camera_dev *pcdev) +{ + return pcdev->devtype == IMX25_CAMERA; +} + +static inline int is_imx27_camera(struct mx2_camera_dev *pcdev) +{ + return pcdev->devtype == IMX27_CAMERA; +} + static struct mx2_buffer *mx2_ibuf_to_buf(struct mx2_buf_internal *int_buf) { return container_of(int_buf, struct mx2_buffer, internal); @@ -406,9 +438,9 @@ static void mx2_camera_deactivate(struct mx2_camera_dev *pcdev) clk_disable_unprepare(pcdev->clk_csi); writel(0, pcdev->base_csi + CSICR1); - if (cpu_is_mx27()) { + if (is_imx27_camera(pcdev)) { writel(0, pcdev->base_emma + PRP_CNTL); - } else if (cpu_is_mx25()) { + } else if (is_imx25_camera(pcdev)) { spin_lock_irqsave(&pcdev->lock, flags); pcdev->fb1_active = NULL; pcdev->fb2_active = NULL; @@ -438,7 +470,7 @@ static int mx2_camera_add_device(struct soc_camera_device *icd) csicr1 = CSICR1_MCLKEN; - if (cpu_is_mx27()) + if (is_imx27_camera(pcdev)) csicr1 |= CSICR1_PRP_IF_EN | CSICR1_FCC | CSICR1_RXFF_LEVEL(0); @@ -514,7 +546,7 @@ out: static irqreturn_t mx25_camera_irq(int irq_csi, void *data) { struct mx2_camera_dev *pcdev = data; - u32 status = readl(pcdev->base_csi + CSISR); + u32 status = readl(pcdev->base_csi + pcdev->reg_csisr); if (status & CSISR_DMA_TSF_FB1_INT) mx25_camera_frame_done(pcdev, 1, MX2_STATE_DONE); @@ -523,7 +555,7 @@ static irqreturn_t mx25_camera_irq(int irq_csi, void *data) /* FIXME: handle CSISR_RFF_OR_INT */ - writel(status, pcdev->base_csi + CSISR); + writel(status, pcdev->base_csi + pcdev->reg_csisr); return IRQ_HANDLED; } @@ -608,7 +640,7 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) buf->state = MX2_STATE_QUEUED; list_add_tail(&buf->internal.queue, &pcdev->capture); - if (cpu_is_mx25()) { + if (is_imx25_camera(pcdev)) { u32 csicr3, dma_inten = 0; if (pcdev->fb1_active == NULL) { @@ -627,20 +659,20 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb) list_del(&buf->internal.queue); buf->state = MX2_STATE_ACTIVE; - csicr3 = readl(pcdev->base_csi + CSICR3); + csicr3 = readl(pcdev->base_csi + pcdev->reg_csicr3); /* Reflash DMA */ writel(csicr3 | CSICR3_DMA_REFLASH_RFF, - pcdev->base_csi + CSICR3); + pcdev->base_csi + pcdev->reg_csicr3); /* clear & enable interrupts */ - writel(dma_inten, pcdev->base_csi + CSISR); + writel(dma_inten, pcdev->base_csi + pcdev->reg_csisr); pcdev->csicr1 |= dma_inten; writel(pcdev->csicr1, pcdev->base_csi + CSICR1); /* enable DMA */ csicr3 |= CSICR3_DMA_REQ_EN_RFF | CSICR3_RXFF_LEVEL(1); - writel(csicr3, pcdev->base_csi + CSICR3); + writel(csicr3, pcdev->base_csi + pcdev->reg_csicr3); } } @@ -684,7 +716,7 @@ static void mx2_videobuf_release(struct vb2_buffer *vb) */ spin_lock_irqsave(&pcdev->lock, flags); - if (cpu_is_mx25() && buf->state == MX2_STATE_ACTIVE) { + if (is_imx25_camera(pcdev) && buf->state == MX2_STATE_ACTIVE) { if (pcdev->fb1_active == buf) { pcdev->csicr1 &= ~CSICR1_FB1_DMA_INTEN; writel(0, pcdev->base_csi + CSIDMASA_FB1); @@ -807,7 +839,7 @@ static int mx2_start_streaming(struct vb2_queue *q, unsigned int count) unsigned long phys; int bytesperline; - if (cpu_is_mx27()) { + if (is_imx27_camera(pcdev)) { unsigned long flags; if (count < 2) return -EINVAL; @@ -902,7 +934,7 @@ static int mx2_stop_streaming(struct vb2_queue *q) void *b; u32 cntl; - if (cpu_is_mx27()) { + if (is_imx27_camera(pcdev)) { spin_lock_irqsave(&pcdev->lock, flags); cntl = readl(pcdev->base_emma + PRP_CNTL); @@ -1054,11 +1086,11 @@ static int mx2_camera_set_bus_param(struct soc_camera_device *icd) if (bytesperline < 0) return bytesperline; - if (cpu_is_mx27()) { + if (is_imx27_camera(pcdev)) { ret = mx27_camera_emma_prp_reset(pcdev); if (ret) return ret; - } else if (cpu_is_mx25()) { + } else if (is_imx25_camera(pcdev)) { writel((bytesperline * icd->user_height) >> 2, pcdev->base_csi + CSIRXCNT); writel((bytesperline << 16) | icd->user_height, @@ -1351,7 +1383,7 @@ static int mx2_camera_try_fmt(struct soc_camera_device *icd, /* FIXME: implement MX27 limits */ /* limit to MX25 hardware capabilities */ - if (cpu_is_mx25()) { + if (is_imx25_camera(pcdev)) { if (xlate->host_fmt->bits_per_sample <= 8) width_limit = 0xffff * 4; else @@ -1685,6 +1717,20 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) goto exit; } + pcdev->devtype = pdev->id_entry->driver_data; + switch (pcdev->devtype) { + case IMX25_CAMERA: + pcdev->reg_csisr = CSISR_IMX25; + pcdev->reg_csicr3 = CSICR3_IMX25; + break; + case IMX27_CAMERA: + pcdev->reg_csisr = CSISR_IMX27; + pcdev->reg_csicr3 = CSICR3_IMX27; + break; + default: + break; + } + pcdev->clk_csi = devm_clk_get(&pdev->dev, "ahb"); if (IS_ERR(pcdev->clk_csi)) { dev_err(&pdev->dev, "Could not get csi clock\n"); @@ -1722,7 +1768,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) pcdev->dev = &pdev->dev; platform_set_drvdata(pdev, pcdev); - if (cpu_is_mx25()) { + if (is_imx25_camera(pcdev)) { err = devm_request_irq(&pdev->dev, irq_csi, mx25_camera_irq, 0, MX2_CAM_DRV_NAME, pcdev); if (err) { @@ -1731,7 +1777,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) } } - if (cpu_is_mx27()) { + if (is_imx27_camera(pcdev)) { err = mx27_camera_emma_init(pdev); if (err) goto exit; @@ -1742,7 +1788,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) pcdev->soc_host.priv = pcdev; pcdev->soc_host.v4l2_dev.dev = &pdev->dev; pcdev->soc_host.nr = pdev->id; - if (cpu_is_mx25()) + if (is_imx25_camera(pcdev)) pcdev->soc_host.capabilities = SOCAM_HOST_CAP_STRIDE; pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev); @@ -1762,7 +1808,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev) exit_free_emma: vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); eallocctx: - if (cpu_is_mx27()) { + if (is_imx27_camera(pcdev)) { clk_disable_unprepare(pcdev->clk_emma_ipg); clk_disable_unprepare(pcdev->clk_emma_ahb); } @@ -1780,7 +1826,7 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev) vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx); - if (cpu_is_mx27()) { + if (is_imx27_camera(pcdev)) { clk_disable_unprepare(pcdev->clk_emma_ipg); clk_disable_unprepare(pcdev->clk_emma_ahb); } @@ -1794,6 +1840,7 @@ static struct platform_driver mx2_camera_driver = { .driver = { .name = MX2_CAM_DRV_NAME, }, + .id_table = mx2_camera_devtype, .remove = __devexit_p(mx2_camera_remove), };
It changes the driver to use platform_device_id rather than cpu_is_xxx to determine the controller type, and updates the platform code accordingly. As the result, mach/hardware.h inclusion gets removed from the driver. Signed-off-by: Shawn Guo <shawn.guo@linaro.org> Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Cc: linux-media@vger.kernel.org --- arch/arm/mach-imx/clk-imx25.c | 6 +- arch/arm/mach-imx/clk-imx27.c | 6 +- arch/arm/mach-imx/devices/devices-common.h | 1 + arch/arm/mach-imx/devices/platform-mx2-camera.c | 12 +-- drivers/media/video/mx2_camera.c | 95 +++++++++++++++++------ 5 files changed, 85 insertions(+), 35 deletions(-)