return -ENOMEM;
}
+ fimc_is_parse_children_dt(&pdev->dev, core);
+
fimc_is_dev = &pdev->dev;
ret = dev_set_drvdata(fimc_is_dev, core);
if (ret) {
/* depended on isp */
struct exynos_platform_fimc_is *pdata;
+ struct device_node *lite_np[FIMC_IS_MAX_NODES];
+ struct device_node *csis_np[FIMC_IS_MAX_NODES];
+
struct fimc_is_resourcemgr resourcemgr;
struct fimc_is_groupmgr groupmgr;
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/errno.h>
+#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include "fimc-is-hw.h"
#include "fimc-is-device-csi.h"
#include "fimc-is-device-sensor.h"
-
+#include "fimc-is-core.h"
extern void s5pcsis_enable_interrupts(unsigned long __iomem *base_reg, struct fimc_is_image *image, bool on);
extern void s5pcsis_set_hsync_settle(unsigned long __iomem *base_reg, int settle);
extern void s5pcsis_set_params(unsigned long __iomem *base_reg, struct fimc_is_image *image, u32 lanes);
struct v4l2_subdev *subdev_csi;
struct fimc_is_device_csi *csi;
struct fimc_is_device_sensor *device = parent;
+ struct fimc_is_core *core;
+
+ core = dev_get_drvdata(fimc_is_dev);
+ BUG_ON(!core);
BUG_ON(!device);
subdev_csi = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
}
csi->instance = instance;
- switch(instance) {
- case CSI_ID_A:
- csi->base_reg = (unsigned long *)MIPICSI0_REG_BASE;
-#ifdef DBG_CSIISR
- ret = request_irq(IRQ_MIPICSI0,
- fimc_is_csi_isr,
- IRQF_SHARED,
- "mipi-csi0",
- csi);
- if (ret) {
- err("request_irq(IRQ_MIPICSI0) is fail(%d)", ret);
- goto p_err_free2;
- }
-#endif
- break;
- case CSI_ID_B:
- csi->base_reg = (unsigned long *)MIPICSI1_REG_BASE;
-#ifdef DBG_CSIISR
- ret = request_irq(IRQ_MIPICSI1,
- fimc_is_csi_isr,
- IRQF_SHARED,
- "mipi-csi1",
- csi);
- if (ret) {
- err("request_irq(IRQ_MIPICSI1) is fail(%d)", ret);
- goto p_err_free2;
- }
-#endif
- break;
- case CSI_ID_C:
- csi->base_reg = (unsigned long *)MIPICSI2_REG_BASE;
- break;
- default:
- err("instance is invalid(%d)", instance);
- ret = -EINVAL;
+
+ csi->base_reg = of_iomap(core->csis_np[instance], 0);
+ if (!csi->base_reg)
goto p_err_free2;
- }
v4l2_subdev_init(subdev_csi, &subdev_ops);
v4l2_set_subdevdata(subdev_csi, csi);
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/device.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <mach/videonode.h>
{
int ret = 0;
struct fimc_is_device_flite *flite;
+ struct fimc_is_core *core;
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+
+ BUG_ON(!core);
BUG_ON(!subdev);
BUG_ON(!framemgr);
clear_bit(FLITE_A_SLOT_VALID, &flite->state);
clear_bit(FLITE_B_SLOT_VALID, &flite->state);
- switch(flite->instance) {
- case FLITE_ID_A:
- ret = request_irq(IRQ_FIMC_LITE0,
- fimc_is_flite_isr,
- IRQF_SHARED,
- "fimc-lite0",
- flite);
- if (ret)
- err("request_irq(L0) failed\n");
- break;
- case FLITE_ID_B:
- ret = request_irq(IRQ_FIMC_LITE1,
- fimc_is_flite_isr,
- IRQF_SHARED,
- "fimc-lite1",
- flite);
- if (ret)
- err("request_irq(L1) failed\n");
- break;
-#ifdef IRQ_FIMC_LITE2
- case FLITE_ID_C:
- ret = request_irq(IRQ_FIMC_LITE2,
- fimc_is_flite_isr,
- IRQF_SHARED,
- "fimc-lite2",
+ ret = of_irq_get(core->lite_np[flite->instance], 0);
+ if (ret > 0)
+ ret = request_irq(ret, fimc_is_flite_isr,
+ IRQF_SHARED, "fimc-lite",
flite);
- if (ret)
- err("request_irq(L2) failed\n");
- break;
-#endif
- default:
- err("instance is invalid(%d)", flite->instance);
- ret = -EINVAL;
- goto p_err;
- }
+ if (ret)
+ err("request_irq(L%d) failed\n", flite->instance);
p_err:
return ret;
{
int ret = 0;
struct fimc_is_device_flite *flite;
+ struct fimc_is_core *core;
+
+ core = (struct fimc_is_core *)dev_get_drvdata(fimc_is_dev);
+ BUG_ON(!core);
BUG_ON(!subdev);
flite = v4l2_get_subdevdata(subdev);
goto p_err;
}
- switch(flite->instance) {
- case FLITE_ID_A:
- free_irq(IRQ_FIMC_LITE0, flite);
- break;
- case FLITE_ID_B:
- free_irq(IRQ_FIMC_LITE1, flite);
- break;
-#ifdef IRQ_FIMC_LITE2
- case FLITE_ID_C:
- free_irq(IRQ_FIMC_LITE2, flite);
- break;
-#endif
- default:
- err("instance is invalid(%d)", flite->instance);
- ret = -EINVAL;
- goto p_err;
- }
+ free_irq(of_irq_get(core->lite_np[flite->instance], 0), flite);
p_err:
return ret;
int ret = 0;
struct v4l2_subdev *subdev_flite;
struct fimc_is_device_flite *flite;
+ struct fimc_is_core *core;
+
+ core = dev_get_drvdata(fimc_is_dev);
+ BUG_ON(!core);
BUG_ON(!device);
subdev_flite = kzalloc(sizeof(struct v4l2_subdev), GFP_KERNEL);
flite->subdev = &device->subdev_flite;
flite->instance = instance;
init_waitqueue_head(&flite->wait_queue);
- switch(instance) {
- case FLITE_ID_A:
- flite->base_reg = (unsigned long *)FIMCLITE0_REG_BASE;
- break;
- case FLITE_ID_B:
- flite->base_reg = (unsigned long *)FIMCLITE1_REG_BASE;
- break;
- case FLITE_ID_C:
- flite->base_reg = (unsigned long *)FIMCLITE2_REG_BASE;
- break;
- default:
- err("instance is invalid(%d)", instance);
- ret = -EINVAL;
- goto err_invalid_instance;
- }
+
+ flite->base_reg = of_iomap(core->lite_np[instance], 0);
+ if (!flite->base_reg)
+ goto err_reg_v4l2_subdev;
v4l2_subdev_init(subdev_flite, &subdev_ops);
v4l2_set_subdevdata(subdev_flite, (void *)flite);
return 0;
err_reg_v4l2_subdev:
-err_invalid_instance:
kfree(flite);
err_alloc_flite:
return ret;
}
+int fimc_is_parse_children_dt(struct device *dev, struct fimc_is_core *core)
+{
+ struct device_node *np = dev->of_node;
+ struct device_node *child;
+
+ for_each_available_child_of_node(np, child) {
+ int i;
+
+ i = of_alias_get_id(child, "fimc-lite");
+ if (i >= 0 || i < FIMC_IS_MAX_NODES)
+ core->lite_np[i] = child;
+
+ i = of_alias_get_id(child, "csis");
+ if (i >= 0 || i < FIMC_IS_MAX_NODES)
+ core->csis_np[i] = child;
+ }
+ return 0;
+}
+
int fimc_is_sensor_parse_dt(struct platform_device *pdev)
{
int ret = 0;
int fimc_is_power_initpin(struct device *dev);
int fimc_is_power_setpin(struct device *dev, int position, int sensor_id);
struct exynos_platform_fimc_is *fimc_is_parse_dt(struct device *dev);
+int fimc_is_parse_children_dt(struct device *dev, struct fimc_is_core *core);
int fimc_is_sensor_parse_dt(struct platform_device *pdev);
#endif
#define ISSR62 (MCUCTL+0x178)
#define ISSR63 (MCUCTL+0x17c)
-/* PMU for FIMC-IS*/
-#define MIPICSI0_REG_BASE (S5P_VA_MIPICSI0)
-#define MIPICSI1_REG_BASE (S5P_VA_MIPICSI1)
-#define MIPICSI2_REG_BASE (S5P_VA_MIPICSI2)
-
-#define FIMCLITE0_REG_BASE (S5P_VA_FIMCLITE0)
-#define FIMCLITE1_REG_BASE (S5P_VA_FIMCLITE1)
-#define FIMCLITE2_REG_BASE (S5P_VA_FIMCLITE2)
-
#define PMUREG_ISP_ARM_CONFIGURATION (S5P_VA_PMU + 0x2580)
#define PMUREG_ISP_ARM_STATUS (S5P_VA_PMU + 0x2584)
#define PMUREG_ISP_ARM_OPTION (S5P_VA_PMU + 0x2588)