media: mx2_camera: remove cpu_is_xxx by using platform_device_id
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> Acked-by: Sascha Hauer <s.hauer@pengutronix.de> Acked-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Tested-by: Javier Martin <javier.martin@vista-silicon.com> Cc: linux-media@vger.kernel.org
This commit is contained in:
parent
e51d0f0ac4
commit
27b76486a3
@ -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_per], "per", "sdhci-esdhc-imx25.1");
|
||||||
clk_register_clkdev(clk[esdhc2_ipg], "ipg", "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[esdhc2_ahb], "ahb", "sdhci-esdhc-imx25.1");
|
||||||
clk_register_clkdev(clk[csi_ipg_per], "per", "mx2-camera.0");
|
clk_register_clkdev(clk[csi_ipg_per], "per", "imx25-camera.0");
|
||||||
clk_register_clkdev(clk[csi_ipg], "ipg", "mx2-camera.0");
|
clk_register_clkdev(clk[csi_ipg], "ipg", "imx25-camera.0");
|
||||||
clk_register_clkdev(clk[csi_ahb], "ahb", "mx2-camera.0");
|
clk_register_clkdev(clk[csi_ahb], "ahb", "imx25-camera.0");
|
||||||
clk_register_clkdev(clk[dummy], "audmux", NULL);
|
clk_register_clkdev(clk[dummy], "audmux", NULL);
|
||||||
clk_register_clkdev(clk[can1_ipg], NULL, "flexcan.0");
|
clk_register_clkdev(clk[can1_ipg], NULL, "flexcan.0");
|
||||||
clk_register_clkdev(clk[can2_ipg], NULL, "flexcan.1");
|
clk_register_clkdev(clk[can2_ipg], NULL, "flexcan.1");
|
||||||
|
@ -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[per3_gate], "per", "imx-fb.0");
|
||||||
clk_register_clkdev(clk[lcdc_ipg_gate], "ipg", "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[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_div], "per", "fsl-usb2-udc");
|
||||||
clk_register_clkdev(clk[usb_ipg_gate], "ipg", "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");
|
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[i2c2_ipg_gate], NULL, "imx21-i2c.1");
|
||||||
clk_register_clkdev(clk[owire_ipg_gate], NULL, "mxc_w1.0");
|
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[kpp_ipg_gate], NULL, "imx-keypad");
|
||||||
clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "mx2-camera.0");
|
clk_register_clkdev(clk[emma_ahb_gate], "emma-ahb", "imx27-camera.0");
|
||||||
clk_register_clkdev(clk[emma_ipg_gate], "emma-ipg", "mx2-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_ahb_gate], "ahb", "m2m-emmaprp.0");
|
||||||
clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0");
|
clk_register_clkdev(clk[emma_ipg_gate], "ipg", "m2m-emmaprp.0");
|
||||||
clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL);
|
clk_register_clkdev(clk[iim_ipg_gate], "iim", NULL);
|
||||||
|
@ -220,6 +220,7 @@ struct platform_device *__init imx_add_mx1_camera(
|
|||||||
|
|
||||||
#include <linux/platform_data/camera-mx2.h>
|
#include <linux/platform_data/camera-mx2.h>
|
||||||
struct imx_mx2_camera_data {
|
struct imx_mx2_camera_data {
|
||||||
|
const char *devid;
|
||||||
resource_size_t iobasecsi;
|
resource_size_t iobasecsi;
|
||||||
resource_size_t iosizecsi;
|
resource_size_t iosizecsi;
|
||||||
resource_size_t irqcsi;
|
resource_size_t irqcsi;
|
||||||
|
@ -9,14 +9,16 @@
|
|||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include "devices-common.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, \
|
.iobasecsi = soc ## _CSI_BASE_ADDR, \
|
||||||
.iosizecsi = SZ_4K, \
|
.iosizecsi = SZ_4K, \
|
||||||
.irqcsi = soc ## _INT_CSI, \
|
.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, \
|
.iobasecsi = soc ## _CSI_BASE_ADDR, \
|
||||||
.iosizecsi = SZ_32, \
|
.iosizecsi = SZ_32, \
|
||||||
.irqcsi = soc ## _INT_CSI, \
|
.irqcsi = soc ## _INT_CSI, \
|
||||||
@ -27,12 +29,12 @@
|
|||||||
|
|
||||||
#ifdef CONFIG_SOC_IMX25
|
#ifdef CONFIG_SOC_IMX25
|
||||||
const struct imx_mx2_camera_data imx25_mx2_camera_data __initconst =
|
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 */
|
#endif /* ifdef CONFIG_SOC_IMX25 */
|
||||||
|
|
||||||
#ifdef CONFIG_SOC_IMX27
|
#ifdef CONFIG_SOC_IMX27
|
||||||
const struct imx_mx2_camera_data imx27_mx2_camera_data __initconst =
|
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 */
|
#endif /* ifdef CONFIG_SOC_IMX27 */
|
||||||
|
|
||||||
struct platform_device *__init imx_add_mx2_camera(
|
struct platform_device *__init imx_add_mx2_camera(
|
||||||
@ -58,7 +60,7 @@ struct platform_device *__init imx_add_mx2_camera(
|
|||||||
.flags = IORESOURCE_IRQ,
|
.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,
|
res, data->iobaseemmaprp ? 4 : 2,
|
||||||
pdata, sizeof(*pdata), DMA_BIT_MASK(32));
|
pdata, sizeof(*pdata), DMA_BIT_MASK(32));
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,6 @@
|
|||||||
#include <linux/videodev2.h>
|
#include <linux/videodev2.h>
|
||||||
|
|
||||||
#include <linux/platform_data/camera-mx2.h>
|
#include <linux/platform_data/camera-mx2.h>
|
||||||
#include <mach/hardware.h>
|
|
||||||
|
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
|
|
||||||
@ -121,11 +120,13 @@
|
|||||||
|
|
||||||
#define CSICR1 0x00
|
#define CSICR1 0x00
|
||||||
#define CSICR2 0x04
|
#define CSICR2 0x04
|
||||||
#define CSISR (cpu_is_mx27() ? 0x08 : 0x18)
|
#define CSISR_IMX25 0x18
|
||||||
|
#define CSISR_IMX27 0x08
|
||||||
#define CSISTATFIFO 0x0c
|
#define CSISTATFIFO 0x0c
|
||||||
#define CSIRFIFO 0x10
|
#define CSIRFIFO 0x10
|
||||||
#define CSIRXCNT 0x14
|
#define CSIRXCNT 0x14
|
||||||
#define CSICR3 (cpu_is_mx27() ? 0x1C : 0x08)
|
#define CSICR3_IMX25 0x08
|
||||||
|
#define CSICR3_IMX27 0x1c
|
||||||
#define CSIDMASA_STATFIFO 0x20
|
#define CSIDMASA_STATFIFO 0x20
|
||||||
#define CSIDMATA_STATFIFO 0x24
|
#define CSIDMATA_STATFIFO 0x24
|
||||||
#define CSIDMASA_FB1 0x28
|
#define CSIDMASA_FB1 0x28
|
||||||
@ -268,6 +269,11 @@ struct mx2_buffer {
|
|||||||
struct mx2_buf_internal internal;
|
struct mx2_buf_internal internal;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum mx2_camera_type {
|
||||||
|
IMX25_CAMERA,
|
||||||
|
IMX27_CAMERA,
|
||||||
|
};
|
||||||
|
|
||||||
struct mx2_camera_dev {
|
struct mx2_camera_dev {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct soc_camera_host soc_host;
|
struct soc_camera_host soc_host;
|
||||||
@ -291,6 +297,9 @@ struct mx2_camera_dev {
|
|||||||
struct mx2_buffer *fb2_active;
|
struct mx2_buffer *fb2_active;
|
||||||
|
|
||||||
u32 csicr1;
|
u32 csicr1;
|
||||||
|
u32 reg_csisr;
|
||||||
|
u32 reg_csicr3;
|
||||||
|
enum mx2_camera_type devtype;
|
||||||
|
|
||||||
struct mx2_buf_internal buf_discard[2];
|
struct mx2_buf_internal buf_discard[2];
|
||||||
void *discard_buffer;
|
void *discard_buffer;
|
||||||
@ -303,6 +312,29 @@ struct mx2_camera_dev {
|
|||||||
struct vb2_alloc_ctx *alloc_ctx;
|
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)
|
static struct mx2_buffer *mx2_ibuf_to_buf(struct mx2_buf_internal *int_buf)
|
||||||
{
|
{
|
||||||
return container_of(int_buf, struct mx2_buffer, internal);
|
return container_of(int_buf, struct mx2_buffer, internal);
|
||||||
@ -434,9 +466,9 @@ static void mx2_camera_deactivate(struct mx2_camera_dev *pcdev)
|
|||||||
|
|
||||||
clk_disable_unprepare(pcdev->clk_csi);
|
clk_disable_unprepare(pcdev->clk_csi);
|
||||||
writel(0, pcdev->base_csi + CSICR1);
|
writel(0, pcdev->base_csi + CSICR1);
|
||||||
if (cpu_is_mx27()) {
|
if (is_imx27_camera(pcdev)) {
|
||||||
writel(0, pcdev->base_emma + PRP_CNTL);
|
writel(0, pcdev->base_emma + PRP_CNTL);
|
||||||
} else if (cpu_is_mx25()) {
|
} else if (is_imx25_camera(pcdev)) {
|
||||||
spin_lock_irqsave(&pcdev->lock, flags);
|
spin_lock_irqsave(&pcdev->lock, flags);
|
||||||
pcdev->fb1_active = NULL;
|
pcdev->fb1_active = NULL;
|
||||||
pcdev->fb2_active = NULL;
|
pcdev->fb2_active = NULL;
|
||||||
@ -466,7 +498,7 @@ static int mx2_camera_add_device(struct soc_camera_device *icd)
|
|||||||
|
|
||||||
csicr1 = CSICR1_MCLKEN;
|
csicr1 = CSICR1_MCLKEN;
|
||||||
|
|
||||||
if (cpu_is_mx27())
|
if (is_imx27_camera(pcdev))
|
||||||
csicr1 |= CSICR1_PRP_IF_EN | CSICR1_FCC |
|
csicr1 |= CSICR1_PRP_IF_EN | CSICR1_FCC |
|
||||||
CSICR1_RXFF_LEVEL(0);
|
CSICR1_RXFF_LEVEL(0);
|
||||||
|
|
||||||
@ -542,7 +574,7 @@ out:
|
|||||||
static irqreturn_t mx25_camera_irq(int irq_csi, void *data)
|
static irqreturn_t mx25_camera_irq(int irq_csi, void *data)
|
||||||
{
|
{
|
||||||
struct mx2_camera_dev *pcdev = 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)
|
if (status & CSISR_DMA_TSF_FB1_INT)
|
||||||
mx25_camera_frame_done(pcdev, 1, MX2_STATE_DONE);
|
mx25_camera_frame_done(pcdev, 1, MX2_STATE_DONE);
|
||||||
@ -551,7 +583,7 @@ static irqreturn_t mx25_camera_irq(int irq_csi, void *data)
|
|||||||
|
|
||||||
/* FIXME: handle CSISR_RFF_OR_INT */
|
/* FIXME: handle CSISR_RFF_OR_INT */
|
||||||
|
|
||||||
writel(status, pcdev->base_csi + CSISR);
|
writel(status, pcdev->base_csi + pcdev->reg_csisr);
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
@ -636,7 +668,7 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb)
|
|||||||
buf->state = MX2_STATE_QUEUED;
|
buf->state = MX2_STATE_QUEUED;
|
||||||
list_add_tail(&buf->internal.queue, &pcdev->capture);
|
list_add_tail(&buf->internal.queue, &pcdev->capture);
|
||||||
|
|
||||||
if (cpu_is_mx25()) {
|
if (is_imx25_camera(pcdev)) {
|
||||||
u32 csicr3, dma_inten = 0;
|
u32 csicr3, dma_inten = 0;
|
||||||
|
|
||||||
if (pcdev->fb1_active == NULL) {
|
if (pcdev->fb1_active == NULL) {
|
||||||
@ -655,20 +687,20 @@ static void mx2_videobuf_queue(struct vb2_buffer *vb)
|
|||||||
list_del(&buf->internal.queue);
|
list_del(&buf->internal.queue);
|
||||||
buf->state = MX2_STATE_ACTIVE;
|
buf->state = MX2_STATE_ACTIVE;
|
||||||
|
|
||||||
csicr3 = readl(pcdev->base_csi + CSICR3);
|
csicr3 = readl(pcdev->base_csi + pcdev->reg_csicr3);
|
||||||
|
|
||||||
/* Reflash DMA */
|
/* Reflash DMA */
|
||||||
writel(csicr3 | CSICR3_DMA_REFLASH_RFF,
|
writel(csicr3 | CSICR3_DMA_REFLASH_RFF,
|
||||||
pcdev->base_csi + CSICR3);
|
pcdev->base_csi + pcdev->reg_csicr3);
|
||||||
|
|
||||||
/* clear & enable interrupts */
|
/* clear & enable interrupts */
|
||||||
writel(dma_inten, pcdev->base_csi + CSISR);
|
writel(dma_inten, pcdev->base_csi + pcdev->reg_csisr);
|
||||||
pcdev->csicr1 |= dma_inten;
|
pcdev->csicr1 |= dma_inten;
|
||||||
writel(pcdev->csicr1, pcdev->base_csi + CSICR1);
|
writel(pcdev->csicr1, pcdev->base_csi + CSICR1);
|
||||||
|
|
||||||
/* enable DMA */
|
/* enable DMA */
|
||||||
csicr3 |= CSICR3_DMA_REQ_EN_RFF | CSICR3_RXFF_LEVEL(1);
|
csicr3 |= CSICR3_DMA_REQ_EN_RFF | CSICR3_RXFF_LEVEL(1);
|
||||||
writel(csicr3, pcdev->base_csi + CSICR3);
|
writel(csicr3, pcdev->base_csi + pcdev->reg_csicr3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -712,7 +744,7 @@ static void mx2_videobuf_release(struct vb2_buffer *vb)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
spin_lock_irqsave(&pcdev->lock, flags);
|
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) {
|
if (pcdev->fb1_active == buf) {
|
||||||
pcdev->csicr1 &= ~CSICR1_FB1_DMA_INTEN;
|
pcdev->csicr1 &= ~CSICR1_FB1_DMA_INTEN;
|
||||||
writel(0, pcdev->base_csi + CSIDMASA_FB1);
|
writel(0, pcdev->base_csi + CSIDMASA_FB1);
|
||||||
@ -835,7 +867,7 @@ static int mx2_start_streaming(struct vb2_queue *q, unsigned int count)
|
|||||||
unsigned long phys;
|
unsigned long phys;
|
||||||
int bytesperline;
|
int bytesperline;
|
||||||
|
|
||||||
if (cpu_is_mx27()) {
|
if (is_imx27_camera(pcdev)) {
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
if (count < 2)
|
if (count < 2)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -930,7 +962,7 @@ static int mx2_stop_streaming(struct vb2_queue *q)
|
|||||||
void *b;
|
void *b;
|
||||||
u32 cntl;
|
u32 cntl;
|
||||||
|
|
||||||
if (cpu_is_mx27()) {
|
if (is_imx27_camera(pcdev)) {
|
||||||
spin_lock_irqsave(&pcdev->lock, flags);
|
spin_lock_irqsave(&pcdev->lock, flags);
|
||||||
|
|
||||||
cntl = readl(pcdev->base_emma + PRP_CNTL);
|
cntl = readl(pcdev->base_emma + PRP_CNTL);
|
||||||
@ -1082,11 +1114,11 @@ static int mx2_camera_set_bus_param(struct soc_camera_device *icd)
|
|||||||
if (bytesperline < 0)
|
if (bytesperline < 0)
|
||||||
return bytesperline;
|
return bytesperline;
|
||||||
|
|
||||||
if (cpu_is_mx27()) {
|
if (is_imx27_camera(pcdev)) {
|
||||||
ret = mx27_camera_emma_prp_reset(pcdev);
|
ret = mx27_camera_emma_prp_reset(pcdev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
} else if (cpu_is_mx25()) {
|
} else if (is_imx25_camera(pcdev)) {
|
||||||
writel((bytesperline * icd->user_height) >> 2,
|
writel((bytesperline * icd->user_height) >> 2,
|
||||||
pcdev->base_csi + CSIRXCNT);
|
pcdev->base_csi + CSIRXCNT);
|
||||||
writel((bytesperline << 16) | icd->user_height,
|
writel((bytesperline << 16) | icd->user_height,
|
||||||
@ -1392,7 +1424,7 @@ static int mx2_camera_try_fmt(struct soc_camera_device *icd,
|
|||||||
/* FIXME: implement MX27 limits */
|
/* FIXME: implement MX27 limits */
|
||||||
|
|
||||||
/* limit to MX25 hardware capabilities */
|
/* limit to MX25 hardware capabilities */
|
||||||
if (cpu_is_mx25()) {
|
if (is_imx25_camera(pcdev)) {
|
||||||
if (xlate->host_fmt->bits_per_sample <= 8)
|
if (xlate->host_fmt->bits_per_sample <= 8)
|
||||||
width_limit = 0xffff * 4;
|
width_limit = 0xffff * 4;
|
||||||
else
|
else
|
||||||
@ -1726,6 +1758,20 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
|
|||||||
goto exit;
|
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");
|
pcdev->clk_csi = devm_clk_get(&pdev->dev, "ahb");
|
||||||
if (IS_ERR(pcdev->clk_csi)) {
|
if (IS_ERR(pcdev->clk_csi)) {
|
||||||
dev_err(&pdev->dev, "Could not get csi clock\n");
|
dev_err(&pdev->dev, "Could not get csi clock\n");
|
||||||
@ -1763,7 +1809,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
|
|||||||
pcdev->dev = &pdev->dev;
|
pcdev->dev = &pdev->dev;
|
||||||
platform_set_drvdata(pdev, pcdev);
|
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,
|
err = devm_request_irq(&pdev->dev, irq_csi, mx25_camera_irq, 0,
|
||||||
MX2_CAM_DRV_NAME, pcdev);
|
MX2_CAM_DRV_NAME, pcdev);
|
||||||
if (err) {
|
if (err) {
|
||||||
@ -1772,7 +1818,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);
|
err = mx27_camera_emma_init(pdev);
|
||||||
if (err)
|
if (err)
|
||||||
goto exit;
|
goto exit;
|
||||||
@ -1789,7 +1835,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
|
|||||||
pcdev->soc_host.priv = pcdev;
|
pcdev->soc_host.priv = pcdev;
|
||||||
pcdev->soc_host.v4l2_dev.dev = &pdev->dev;
|
pcdev->soc_host.v4l2_dev.dev = &pdev->dev;
|
||||||
pcdev->soc_host.nr = pdev->id;
|
pcdev->soc_host.nr = pdev->id;
|
||||||
if (cpu_is_mx25())
|
if (is_imx25_camera(pcdev))
|
||||||
pcdev->soc_host.capabilities = SOCAM_HOST_CAP_STRIDE;
|
pcdev->soc_host.capabilities = SOCAM_HOST_CAP_STRIDE;
|
||||||
|
|
||||||
pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
|
pcdev->alloc_ctx = vb2_dma_contig_init_ctx(&pdev->dev);
|
||||||
@ -1809,7 +1855,7 @@ static int __devinit mx2_camera_probe(struct platform_device *pdev)
|
|||||||
exit_free_emma:
|
exit_free_emma:
|
||||||
vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
|
vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
|
||||||
eallocctx:
|
eallocctx:
|
||||||
if (cpu_is_mx27()) {
|
if (is_imx27_camera(pcdev)) {
|
||||||
clk_disable_unprepare(pcdev->clk_emma_ipg);
|
clk_disable_unprepare(pcdev->clk_emma_ipg);
|
||||||
clk_disable_unprepare(pcdev->clk_emma_ahb);
|
clk_disable_unprepare(pcdev->clk_emma_ahb);
|
||||||
}
|
}
|
||||||
@ -1827,7 +1873,7 @@ static int __devexit mx2_camera_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
vb2_dma_contig_cleanup_ctx(pcdev->alloc_ctx);
|
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_ipg);
|
||||||
clk_disable_unprepare(pcdev->clk_emma_ahb);
|
clk_disable_unprepare(pcdev->clk_emma_ahb);
|
||||||
}
|
}
|
||||||
@ -1841,6 +1887,7 @@ static struct platform_driver mx2_camera_driver = {
|
|||||||
.driver = {
|
.driver = {
|
||||||
.name = MX2_CAM_DRV_NAME,
|
.name = MX2_CAM_DRV_NAME,
|
||||||
},
|
},
|
||||||
|
.id_table = mx2_camera_devtype,
|
||||||
.remove = __devexit_p(mx2_camera_remove),
|
.remove = __devexit_p(mx2_camera_remove),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user