summaryrefslogtreecommitdiff
path: root/patches.tizen/0277-media-exynos4-is-Add-support-for-Exynos5250-MIPI-CSI.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/0277-media-exynos4-is-Add-support-for-Exynos5250-MIPI-CSI.patch')
-rw-r--r--patches.tizen/0277-media-exynos4-is-Add-support-for-Exynos5250-MIPI-CSI.patch204
1 files changed, 204 insertions, 0 deletions
diff --git a/patches.tizen/0277-media-exynos4-is-Add-support-for-Exynos5250-MIPI-CSI.patch b/patches.tizen/0277-media-exynos4-is-Add-support-for-Exynos5250-MIPI-CSI.patch
new file mode 100644
index 00000000000..be84cec10d0
--- /dev/null
+++ b/patches.tizen/0277-media-exynos4-is-Add-support-for-Exynos5250-MIPI-CSI.patch
@@ -0,0 +1,204 @@
+From e7c81d3f56036eab0594ceca87088871203cdc51 Mon Sep 17 00:00:00 2001
+From: Sylwester Nawrocki <s.nawrocki@samsung.com>
+Date: Fri, 31 May 2013 10:38:23 -0300
+Subject: [PATCH 0277/1302] [media] exynos4-is: Add support for Exynos5250
+ MIPI-CSIS
+
+Add compatible property for the Exynos5250 and enable the frame start
+and frame end interrupts. These interrupts are needed for the Exynos5
+FIMC-IS firmware. The driver enables those interrupt only where available,
+depending on the 'compatible' property. This can be optimized further,
+by exposing some API at the subdev driver, so the host driver can enable
+extra interrupts only for the image processing chains involving FIMC-IS.
+
+Signed-off-by: Shaik Ameer Basha <shaik.ameer@samsung.com>
+Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com
+Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ .../bindings/media/samsung-mipi-csis.txt | 4 +-
+ drivers/media/platform/exynos4-is/mipi-csis.c | 67 ++++++++++++++++++----
+ 2 files changed, 58 insertions(+), 13 deletions(-)
+
+diff --git a/Documentation/devicetree/bindings/media/samsung-mipi-csis.txt b/Documentation/devicetree/bindings/media/samsung-mipi-csis.txt
+index 5f8e28e..be45f0b 100644
+--- a/Documentation/devicetree/bindings/media/samsung-mipi-csis.txt
++++ b/Documentation/devicetree/bindings/media/samsung-mipi-csis.txt
+@@ -5,8 +5,8 @@ Required properties:
+
+ - compatible : "samsung,s5pv210-csis" for S5PV210 (S5PC110),
+ "samsung,exynos4210-csis" for Exynos4210 (S5PC210),
+- "samsung,exynos4212-csis" for Exynos4212/Exynos4412
+- SoC series;
++ "samsung,exynos4212-csis" for Exynos4212/Exynos4412,
++ "samsung,exynos5250-csis" for Exynos5250;
+ - reg : offset and length of the register set for the device;
+ - interrupts : should contain MIPI CSIS interrupt; the format of the
+ interrupt specifier depends on the interrupt controller;
+diff --git a/drivers/media/platform/exynos4-is/mipi-csis.c b/drivers/media/platform/exynos4-is/mipi-csis.c
+index ae99803..0fe80e3 100644
+--- a/drivers/media/platform/exynos4-is/mipi-csis.c
++++ b/drivers/media/platform/exynos4-is/mipi-csis.c
+@@ -1,8 +1,8 @@
+ /*
+- * Samsung S5P/EXYNOS4 SoC series MIPI-CSI receiver driver
++ * Samsung S5P/EXYNOS SoC series MIPI-CSI receiver driver
+ *
+- * Copyright (C) 2011 - 2012 Samsung Electronics Co., Ltd.
+- * Sylwester Nawrocki <s.nawrocki@samsung.com>
++ * Copyright (C) 2011 - 2013 Samsung Electronics Co., Ltd.
++ * Author: Sylwester Nawrocki <s.nawrocki@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+@@ -66,11 +66,12 @@ MODULE_PARM_DESC(debug, "Debug level (0-2)");
+
+ /* Interrupt mask */
+ #define S5PCSIS_INTMSK 0x10
+-#define S5PCSIS_INTMSK_EN_ALL 0xf000103f
+ #define S5PCSIS_INTMSK_EVEN_BEFORE (1 << 31)
+ #define S5PCSIS_INTMSK_EVEN_AFTER (1 << 30)
+ #define S5PCSIS_INTMSK_ODD_BEFORE (1 << 29)
+ #define S5PCSIS_INTMSK_ODD_AFTER (1 << 28)
++#define S5PCSIS_INTMSK_FRAME_START (1 << 27)
++#define S5PCSIS_INTMSK_FRAME_END (1 << 26)
+ #define S5PCSIS_INTMSK_ERR_SOT_HS (1 << 12)
+ #define S5PCSIS_INTMSK_ERR_LOST_FS (1 << 5)
+ #define S5PCSIS_INTMSK_ERR_LOST_FE (1 << 4)
+@@ -78,6 +79,8 @@ MODULE_PARM_DESC(debug, "Debug level (0-2)");
+ #define S5PCSIS_INTMSK_ERR_ECC (1 << 2)
+ #define S5PCSIS_INTMSK_ERR_CRC (1 << 1)
+ #define S5PCSIS_INTMSK_ERR_UNKNOWN (1 << 0)
++#define S5PCSIS_INTMSK_EXYNOS4_EN_ALL 0xf000103f
++#define S5PCSIS_INTMSK_EXYNOS5_EN_ALL 0xfc00103f
+
+ /* Interrupt source */
+ #define S5PCSIS_INTSRC 0x14
+@@ -88,6 +91,8 @@ MODULE_PARM_DESC(debug, "Debug level (0-2)");
+ #define S5PCSIS_INTSRC_ODD_AFTER (1 << 28)
+ #define S5PCSIS_INTSRC_ODD (0x3 << 28)
+ #define S5PCSIS_INTSRC_NON_IMAGE_DATA (0xff << 28)
++#define S5PCSIS_INTSRC_FRAME_START (1 << 27)
++#define S5PCSIS_INTSRC_FRAME_END (1 << 26)
+ #define S5PCSIS_INTSRC_ERR_SOT_HS (0xf << 12)
+ #define S5PCSIS_INTSRC_ERR_LOST_FS (1 << 5)
+ #define S5PCSIS_INTSRC_ERR_LOST_FE (1 << 4)
+@@ -155,6 +160,9 @@ static const struct s5pcsis_event s5pcsis_events[] = {
+ { S5PCSIS_INTSRC_EVEN_AFTER, "Non-image data after even frame" },
+ { S5PCSIS_INTSRC_ODD_BEFORE, "Non-image data before odd frame" },
+ { S5PCSIS_INTSRC_ODD_AFTER, "Non-image data after odd frame" },
++ /* Frame start/end */
++ { S5PCSIS_INTSRC_FRAME_START, "Frame Start" },
++ { S5PCSIS_INTSRC_FRAME_END, "Frame End" },
+ };
+ #define S5PCSIS_NUM_EVENTS ARRAY_SIZE(s5pcsis_events)
+
+@@ -163,6 +171,11 @@ struct csis_pktbuf {
+ unsigned int len;
+ };
+
++struct csis_drvdata {
++ /* Mask of all used interrupts in S5PCSIS_INTMSK register */
++ u32 interrupt_mask;
++};
++
+ /**
+ * struct csis_state - the driver's internal state data structure
+ * @lock: mutex serializing the subdev and power management operations,
+@@ -175,6 +188,7 @@ struct csis_pktbuf {
+ * @supplies: CSIS regulator supplies
+ * @clock: CSIS clocks
+ * @irq: requested s5p-mipi-csis irq number
++ * @interrupt_mask: interrupt mask of the all used interrupts
+ * @flags: the state variable for power and streaming control
+ * @clock_frequency: device bus clock frequency
+ * @hs_settle: HS-RX settle time
+@@ -197,6 +211,7 @@ struct csis_state {
+ struct regulator_bulk_data supplies[CSIS_NUM_SUPPLIES];
+ struct clk *clock[NUM_CSIS_CLOCKS];
+ int irq;
++ u32 interrupt_mask;
+ u32 flags;
+
+ u32 clk_frequency;
+@@ -278,9 +293,10 @@ static const struct csis_pix_format *find_csis_format(
+ static void s5pcsis_enable_interrupts(struct csis_state *state, bool on)
+ {
+ u32 val = s5pcsis_read(state, S5PCSIS_INTMSK);
+-
+- val = on ? val | S5PCSIS_INTMSK_EN_ALL :
+- val & ~S5PCSIS_INTMSK_EN_ALL;
++ if (on)
++ val |= state->interrupt_mask;
++ else
++ val &= ~state->interrupt_mask;
+ s5pcsis_write(state, S5PCSIS_INTMSK, val);
+ }
+
+@@ -803,8 +819,12 @@ static int s5pcsis_parse_dt(struct platform_device *pdev,
+ #define s5pcsis_parse_dt(pdev, state) (-ENOSYS)
+ #endif
+
++static const struct of_device_id s5pcsis_of_match[];
++
+ static int s5pcsis_probe(struct platform_device *pdev)
+ {
++ const struct of_device_id *of_id;
++ const struct csis_drvdata *drv_data;
+ struct device *dev = &pdev->dev;
+ struct resource *mem_res;
+ struct csis_state *state;
+@@ -819,10 +839,19 @@ static int s5pcsis_probe(struct platform_device *pdev)
+ spin_lock_init(&state->slock);
+ state->pdev = pdev;
+
+- if (dev->of_node)
++ if (dev->of_node) {
++ of_id = of_match_node(s5pcsis_of_match, dev->of_node);
++ if (WARN_ON(of_id == NULL))
++ return -EINVAL;
++
++ drv_data = of_id->data;
++ state->interrupt_mask = drv_data->interrupt_mask;
++
+ ret = s5pcsis_parse_dt(pdev, state);
+- else
++ } else {
+ ret = s5pcsis_get_platform_data(pdev, state);
++ }
++
+ if (ret < 0)
+ return ret;
+
+@@ -1018,9 +1047,25 @@ static const struct dev_pm_ops s5pcsis_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(s5pcsis_suspend, s5pcsis_resume)
+ };
+
++static const struct csis_drvdata exynos4_csis_drvdata = {
++ .interrupt_mask = S5PCSIS_INTMSK_EXYNOS4_EN_ALL,
++};
++
++static const struct csis_drvdata exynos5_csis_drvdata = {
++ .interrupt_mask = S5PCSIS_INTMSK_EXYNOS5_EN_ALL,
++};
++
+ static const struct of_device_id s5pcsis_of_match[] = {
+- { .compatible = "samsung,s5pv210-csis" },
+- { .compatible = "samsung,exynos4210-csis" },
++ {
++ .compatible = "samsung,s5pv210-csis",
++ .data = &exynos4_csis_drvdata,
++ }, {
++ .compatible = "samsung,exynos4210-csis",
++ .data = &exynos4_csis_drvdata,
++ }, {
++ .compatible = "samsung,exynos5250-csis",
++ .data = &exynos5_csis_drvdata,
++ },
+ { /* sentinel */ },
+ };
+ MODULE_DEVICE_TABLE(of, s5pcsis_of_match);
+--
+1.8.3.2
+