On 17 September 2012 15:59, Guennadi Liakhovetski <g.liakhovetski@xxxxxx> wrote: > On Mon, 17 Sep 2012, javier Martin wrote: > >> Hi Shawn, >> >> On 17 September 2012 11:21, Guennadi Liakhovetski <g.liakhovetski@xxxxxx> 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@xxxxxxxxxx> >> >> Cc: Guennadi Liakhovetski <g.liakhovetski@xxxxxx> >> >> Cc: linux-media@xxxxxxxxxxxxxxx >> > Tested-by: Javier Martin <javier.martin@xxxxxxxxxxxxxxxxx> >> > Acked-by: Guennadi Liakhovetski <g.liakhovetski@xxxxxx> >> >> 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@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- 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 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html