Created
January 11, 2019 12:37
-
-
Save openedev/518b9e141f53814bb3adfac6f2bfd78c to your computer and use it in GitHub Desktop.
SUN6I-CSI
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
commit 8427f6b2b471ed7a05d922b17f96bf5510a7add2 | |
Author: Jagan Teki <jagan@amarulasolutions.com> | |
Date: Fri Jan 11 18:00:56 2019 +0530 | |
media: sun6i: Add mod_rate quirk | |
Unfortunately default CSI_SCLK rate cannot work properly to | |
drive the connected sensor interface, particularly on few | |
Allwinner SoC's like A64. | |
So, add mod_rate quirk via driver data so-that the respective | |
SoC's which require to alter the default mod clock rate can assign | |
the operating clock rate. | |
Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> | |
diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c | |
index ee882b66a5ea..79d6025259dd 100644 | |
--- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c | |
+++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c | |
@@ -15,6 +15,7 @@ | |
#include <linux/ioctl.h> | |
#include <linux/module.h> | |
#include <linux/of.h> | |
+#include <linux/of_device.h> | |
#include <linux/platform_device.h> | |
#include <linux/pm_runtime.h> | |
#include <linux/regmap.h> | |
@@ -28,8 +29,13 @@ | |
#define MODULE_NAME "sun6i-csi" | |
+struct sun6i_csi_variant { | |
+ unsigned long mod_rate; | |
+}; | |
+ | |
struct sun6i_csi_dev { | |
struct sun6i_csi csi; | |
+ const struct sun6i_csi_variant *variant; | |
struct device *dev; | |
struct regmap *regmap; | |
@@ -161,15 +167,20 @@ int sun6i_csi_set_power(struct sun6i_csi *csi, bool enable) | |
regmap_update_bits(regmap, CSI_EN_REG, CSI_EN_CSI_EN, 0); | |
clk_disable_unprepare(sdev->clk_ram); | |
+ if (sdev->variant->mod_rate) | |
+ clk_rate_exclusive_put(sdev->clk_mod); | |
clk_disable_unprepare(sdev->clk_mod); | |
reset_control_assert(sdev->rstc_bus); | |
return 0; | |
} | |
+ if (sdev->variant->mod_rate) | |
+ clk_set_rate_exclusive(sdev->clk_mod, sdev->variant->mod_rate); | |
+ | |
ret = clk_prepare_enable(sdev->clk_mod); | |
if (ret) { | |
dev_err(sdev->dev, "Enable csi clk err %d\n", ret); | |
- return ret; | |
+ goto clk_mod_put; | |
} | |
ret = clk_prepare_enable(sdev->clk_ram); | |
@@ -192,6 +203,9 @@ int sun6i_csi_set_power(struct sun6i_csi *csi, bool enable) | |
clk_disable_unprepare(sdev->clk_ram); | |
clk_mod_disable: | |
clk_disable_unprepare(sdev->clk_mod); | |
+clk_mod_put: | |
+ if (sdev->variant->mod_rate) | |
+ clk_rate_exclusive_put(sdev->clk_mod); | |
return ret; | |
} | |
@@ -891,10 +905,13 @@ static int sun6i_csi_remove(struct platform_device *pdev) | |
return 0; | |
} | |
+static const struct sun6i_csi_variant sun6i_a31_csi = { | |
+}; | |
+ | |
static const struct of_device_id sun6i_csi_of_match[] = { | |
- { .compatible = "allwinner,sun6i-a31-csi", }, | |
- { .compatible = "allwinner,sun8i-h3-csi", }, | |
- { .compatible = "allwinner,sun8i-v3s-csi", }, | |
+ { .compatible = "allwinner,sun6i-a31-csi", .data = &sun6i_a31_csi, }, | |
+ { .compatible = "allwinner,sun8i-h3-csi", .data = &sun6i_a31_csi, }, | |
+ { .compatible = "allwinner,sun8i-v3s-csi", .data = &sun6i_a31_csi, }, | |
{}, | |
}; | |
MODULE_DEVICE_TABLE(of, sun6i_csi_of_match); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment