summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0038-media-aspeed-backport-ikvm-patches.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0038-media-aspeed-backport-ikvm-patches.patch')
-rw-r--r--meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0038-media-aspeed-backport-ikvm-patches.patch174
1 files changed, 174 insertions, 0 deletions
diff --git a/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0038-media-aspeed-backport-ikvm-patches.patch b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0038-media-aspeed-backport-ikvm-patches.patch
new file mode 100644
index 000000000..92d0a045d
--- /dev/null
+++ b/meta-openbmc-mods/meta-common/recipes-kernel/linux/linux-aspeed/0038-media-aspeed-backport-ikvm-patches.patch
@@ -0,0 +1,174 @@
+From 13d6fd0f71b3d0d69370878613bf7eb78fefa18f Mon Sep 17 00:00:00 2001
+From: Jae Hyun Yoo <jae.hyun.yoo@intel.com>
+Date: Fri, 9 Nov 2018 11:32:27 -0800
+Subject: [PATCH] Add Aspeed Video Engine Driver
+
+media: platform: Fix missing spin_lock_init()
+
+The driver allocates the spinlock but not initialize it.
+Use spin_lock_init() on it to initialize it correctly.
+
+This is detected by Coccinelle semantic patch.
+
+Fixes: d2b4387f3bdf ("media: platform: Add Aspeed Video Engine driver")
+
+Signed-off-by: Eddie James <eajames@linux.ibm.com>
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+Reviewed-by: Rob Herring <robh@kernel.org>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
+Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>
+---
+ arch/arm/boot/dts/aspeed-g5.dtsi | 11 +++++++++
+ drivers/clk/clk-aspeed.c | 41 ++++++++++++++++++++++++++++++--
+ drivers/media/platform/aspeed-video.c | 1 +
+ include/dt-bindings/clock/aspeed-clock.h | 1 +
+ 4 files changed, 52 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm/boot/dts/aspeed-g5.dtsi b/arch/arm/boot/dts/aspeed-g5.dtsi
+index 6f26e0d323d6..d5783eaf30ae 100644
+--- a/arch/arm/boot/dts/aspeed-g5.dtsi
++++ b/arch/arm/boot/dts/aspeed-g5.dtsi
+@@ -243,6 +243,17 @@
+ interrupts = <0x19>;
+ };
+
++ video: video@1e700000 {
++ compatible = "aspeed,ast2500-video-engine";
++ reg = <0x1e700000 0x20000>;
++ clocks = <&syscon ASPEED_CLK_GATE_VCLK>,
++ <&syscon ASPEED_CLK_GATE_ECLK>;
++ clock-names = "vclk", "eclk";
++ resets = <&syscon ASPEED_RESET_VIDEO>;
++ interrupts = <7>;
++ status = "disabled";
++ };
++
+ adc: adc@1e6e9000 {
+ compatible = "aspeed,ast2500-adc";
+ reg = <0x1e6e9000 0xb0>;
+diff --git a/drivers/clk/clk-aspeed.c b/drivers/clk/clk-aspeed.c
+index 3bbb4fbf00c9..6cea55de485f 100644
+--- a/drivers/clk/clk-aspeed.c
++++ b/drivers/clk/clk-aspeed.c
+@@ -95,7 +95,7 @@ struct aspeed_clk_gate {
+ /* TODO: ask Aspeed about the actual parent data */
+ static const struct aspeed_gate_data aspeed_gates[] = {
+ /* clk rst name parent flags */
+- [ASPEED_CLK_GATE_ECLK] = { 0, -1, "eclk-gate", "eclk", 0 }, /* Video Engine */
++ [ASPEED_CLK_GATE_ECLK] = { 0, 6, "eclk-gate", "eclk", 0 }, /* Video Engine */
+ [ASPEED_CLK_GATE_GCLK] = { 1, 7, "gclk-gate", NULL, 0 }, /* 2D engine */
+ [ASPEED_CLK_GATE_MCLK] = { 2, -1, "mclk-gate", "mpll", CLK_IS_CRITICAL }, /* SDRAM */
+ [ASPEED_CLK_GATE_VCLK] = { 3, 6, "vclk-gate", NULL, 0 }, /* Video Capture */
+@@ -121,6 +121,24 @@ static const struct aspeed_gate_data aspeed_gates[] = {
+ [ASPEED_CLK_GATE_LHCCLK] = { 28, -1, "lhclk-gate", "lhclk", 0 }, /* LPC master/LPC+ */
+ };
+
++static const char * const eclk_parent_names[] = {
++ "mpll",
++ "hpll",
++ "dpll",
++};
++
++static const struct clk_div_table ast2500_eclk_div_table[] = {
++ { 0x0, 2 },
++ { 0x1, 2 },
++ { 0x2, 3 },
++ { 0x3, 4 },
++ { 0x4, 5 },
++ { 0x5, 6 },
++ { 0x6, 7 },
++ { 0x7, 8 },
++ { 0 }
++};
++
+ static const struct clk_div_table ast2500_mac_div_table[] = {
+ { 0x0, 4 }, /* Yep, really. Aspeed confirmed this is correct */
+ { 0x1, 4 },
+@@ -200,18 +218,21 @@ static struct clk_hw *aspeed_ast2500_calc_pll(const char *name, u32 val)
+
+ struct aspeed_clk_soc_data {
+ const struct clk_div_table *div_table;
++ const struct clk_div_table *eclk_div_table;
+ const struct clk_div_table *mac_div_table;
+ struct clk_hw *(*calc_pll)(const char *name, u32 val);
+ };
+
+ static const struct aspeed_clk_soc_data ast2500_data = {
+ .div_table = ast2500_div_table,
++ .eclk_div_table = ast2500_eclk_div_table,
+ .mac_div_table = ast2500_mac_div_table,
+ .calc_pll = aspeed_ast2500_calc_pll,
+ };
+
+ static const struct aspeed_clk_soc_data ast2400_data = {
+ .div_table = ast2400_div_table,
++ .eclk_div_table = ast2400_div_table,
+ .mac_div_table = ast2400_div_table,
+ .calc_pll = aspeed_ast2400_calc_pll,
+ };
+@@ -325,6 +346,7 @@ static const u8 aspeed_resets[] = {
+ [ASPEED_RESET_PECI] = 10,
+ [ASPEED_RESET_I2C] = 2,
+ [ASPEED_RESET_AHB] = 1,
++ [ASPEED_RESET_VIDEO] = 6,
+
+ /*
+ * SCUD4 resets start at an offset to separate them from
+@@ -538,6 +560,22 @@ static int aspeed_clk_probe(struct platform_device *pdev)
+ return PTR_ERR(hw);
+ aspeed_clk_data->hws[ASPEED_CLK_24M] = hw;
+
++ hw = clk_hw_register_mux(dev, "eclk-mux", eclk_parent_names,
++ ARRAY_SIZE(eclk_parent_names), 0,
++ scu_base + ASPEED_CLK_SELECTION, 2, 0x3, 0,
++ &aspeed_clk_lock);
++ if (IS_ERR(hw))
++ return PTR_ERR(hw);
++ aspeed_clk_data->hws[ASPEED_CLK_ECLK_MUX] = hw;
++
++ hw = clk_hw_register_divider_table(dev, "eclk", "eclk-mux", 0,
++ scu_base + ASPEED_CLK_SELECTION, 28,
++ 3, 0, soc_data->eclk_div_table,
++ &aspeed_clk_lock);
++ if (IS_ERR(hw))
++ return PTR_ERR(hw);
++ aspeed_clk_data->hws[ASPEED_CLK_ECLK] = hw;
++
+ /*
+ * TODO: There are a number of clocks that not included in this driver
+ * as more information is required:
+@@ -547,7 +585,6 @@ static int aspeed_clk_probe(struct platform_device *pdev)
+ * RGMII
+ * RMII
+ * UART[1..5] clock source mux
+- * Video Engine (ECLK) mux and clock divider
+ */
+
+ /* Get the uart clock source configuration from SCU4C*/
+diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c
+index dfec813f50a9..692e08ef38c0 100644
+--- a/drivers/media/platform/aspeed-video.c
++++ b/drivers/media/platform/aspeed-video.c
+@@ -1661,6 +1661,7 @@ static int aspeed_video_probe(struct platform_device *pdev)
+
+ video->frame_rate = 30;
+ video->dev = &pdev->dev;
++ spin_lock_init(&video->lock);
+ mutex_init(&video->video_lock);
+ init_waitqueue_head(&video->wait);
+ INIT_DELAYED_WORK(&video->res_work, aspeed_video_resolution_work);
+diff --git a/include/dt-bindings/clock/aspeed-clock.h b/include/dt-bindings/clock/aspeed-clock.h
+index 335879505a72..0b0f3a0ebe9b 100644
+--- a/include/dt-bindings/clock/aspeed-clock.h
++++ b/include/dt-bindings/clock/aspeed-clock.h
+@@ -52,5 +52,6 @@
+ #define ASPEED_RESET_I2C 7
+ #define ASPEED_RESET_AHB 8
+ #define ASPEED_RESET_CRT1 9
++#define ASPEED_RESET_VIDEO 10
+
+ #endif
+--
+2.7.4
+