kernel: add some omap/pandaboard patches.
authorArne Fitzenreiter <arne_f@ipfire.org>
Fri, 14 Feb 2014 22:41:13 +0000 (23:41 +0100)
committerArne Fitzenreiter <arne_f@ipfire.org>
Fri, 14 Feb 2014 22:41:13 +0000 (23:41 +0100)
39 files changed:
lfs/linux
src/patches/kernel/omap/0002-omap2-twl-common-Add-default-power-configuration.patch [new file with mode: 0644]
src/patches/kernel/omap/3isp/0001-omap3isp-Use-the-common-clock-framework.patch [new file with mode: 0644]
src/patches/kernel/omap/3isp/0002-mt9m032-Fix-PLL-setup.patch [new file with mode: 0644]
src/patches/kernel/omap/3isp/0003-mt9m032-Define-MT9M032_READ_MODE1-bits.patch [new file with mode: 0644]
src/patches/kernel/omap/3isp/0004-mt9p031-Use-devm_-managed-helpers.patch [new file with mode: 0644]
src/patches/kernel/omap/3isp/0005-mt9p031-Add-support-for-regulators.patch [new file with mode: 0644]
src/patches/kernel/omap/3isp/0006-mt9p031-Use-the-common-clock-framework.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/0001-meego-modedb-add-Toshiba-LTA070B220F-800x480-support.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/0002-backlight-Add-TLC59108-backlight-control-driver.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/0003-tlc59108-adjust-for-beagleboard-uLCD7.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/0004-zeroMAP-Open-your-eyes.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/0005-ARM-OMAP-Beagle-use-TWL4030-generic-reset-script.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/0006-DSS2-use-DSI-PLL-for-DPI-with-OMAP3.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0001-Beagle-expansion-add-buddy-param-for-expansionboard-.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0002-Beagle-expansion-add-zippy.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0003-Beagle-expansion-add-zippy2.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0004-Beagle-expansion-add-trainer.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0005-Beagle-expansion-add-CircuitCo-ulcd-Support.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0006-Beagle-expansion-add-wifi.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0007-Beagle-expansion-add-beaglefpga.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0008-Beagle-expansion-add-spidev.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0009-Beagle-expansion-add-Aptina-li5m03-camera.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0010-Beagle-expansion-add-LSR-COM6L-Adapter-Board.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0011-Beagle-expansion-LSR-COM6L-Adapter-Board-also-initia.patch [new file with mode: 0644]
src/patches/kernel/omap/beagle/expansion/0011-WIP-Beagle-expansion-extend-spidev-to-uart2.patch [new file with mode: 0644]
src/patches/kernel/omap/panda/0001-panda-fix-wl12xx-regulator.patch [new file with mode: 0644]
src/patches/kernel/omap/panda/0002-ti-st-st-kim-fixing-firmware-path.patch [new file with mode: 0644]
src/patches/kernel/omap/panda/0003-Panda-expansion-add-spidev.patch [new file with mode: 0644]
src/patches/kernel/omap/panda/0004-HACK-PandaES-disable-cpufreq-so-board-will-boot.patch [new file with mode: 0644]
src/patches/kernel/omap/panda/0006-ARM-hw_breakpoint-Enable-debug-powerdown-only-if-sys.patch [new file with mode: 0644]
src/patches/kernel/omap/panda/0007-Revert-regulator-twl-Remove-TWL6030_FIXED_RESOURCE.patch [new file with mode: 0644]
src/patches/kernel/omap/panda/0008-Revert-regulator-twl-Remove-another-unused-variable-.patch [new file with mode: 0644]
src/patches/kernel/omap/panda/0009-Revert-regulator-twl-Remove-references-to-the-twl403.patch [new file with mode: 0644]
src/patches/kernel/omap/panda/0010-Revert-regulator-twl-Remove-references-to-32kHz-cloc.patch [new file with mode: 0644]
src/patches/kernel/omap/panda/0011-panda-spidev-setup-pinmux.patch [new file with mode: 0644]
src/patches/kernel/omap/sakoman/0001-OMAP-DSS2-add-bootarg-for-selecting-svideo.patch [new file with mode: 0644]
src/patches/kernel/omap/sakoman/0002-video-add-timings-for-hd720.patch [new file with mode: 0644]
src/patches/kernel/omap/sgx/0001-arm-Export-cache-flush-management-symbols-when-MULTI.patch [new file with mode: 0644]

index 08fa9a3..5ccc209 100644 (file)
--- a/lfs/linux
+++ b/lfs/linux
@@ -161,11 +161,41 @@ endif
 
 ifeq "$(KCFG)" "-multi"
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.10.27-fs-exec-atomic64-operand-requires-impossible-reload.patch
-#      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.2-0001-panda-wlan-fix.patch
-#      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.2-0002-panda-i2c.patch
-#      cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.2-panda-reboot.patch
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux-3.10-smsc95xx-add_mac_addr_param.patch
 
+       # Patchset for Omap (beagle/panda).
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/0002-omap2-twl-common-Add-default-power-configuration.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/sakoman/0001-OMAP-DSS2-add-bootarg-for-selecting-svideo.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/sakoman/0002-video-add-timings-for-hd720.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0001-Beagle-expansion-add-buddy-param-for-expansionboard-.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0002-Beagle-expansion-add-zippy.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0003-Beagle-expansion-add-zippy2.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0004-Beagle-expansion-add-trainer.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0005-Beagle-expansion-add-CircuitCo-ulcd-Support.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0006-Beagle-expansion-add-wifi.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0007-Beagle-expansion-add-beaglefpga.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0008-Beagle-expansion-add-spidev.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0009-Beagle-expansion-add-Aptina-li5m03-camera.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0010-Beagle-expansion-add-LSR-COM6L-Adapter-Board.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/expansion/0011-Beagle-expansion-LSR-COM6L-Adapter-Board-also-initia.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0001-meego-modedb-add-Toshiba-LTA070B220F-800x480-support.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0002-backlight-Add-TLC59108-backlight-control-driver.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0003-tlc59108-adjust-for-beagleboard-uLCD7.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0004-zeroMAP-Open-your-eyes.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0005-ARM-OMAP-Beagle-use-TWL4030-generic-reset-script.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/beagle/0006-DSS2-use-DSI-PLL-for-DPI-with-OMAP3.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0001-panda-fix-wl12xx-regulator.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0002-ti-st-st-kim-fixing-firmware-path.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0003-Panda-expansion-add-spidev.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0004-HACK-PandaES-disable-cpufreq-so-board-will-boot.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0006-ARM-hw_breakpoint-Enable-debug-powerdown-only-if-sys.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0007-Revert-regulator-twl-Remove-TWL6030_FIXED_RESOURCE.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0008-Revert-regulator-twl-Remove-another-unused-variable-.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0009-Revert-regulator-twl-Remove-references-to-the-twl403.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0010-Revert-regulator-twl-Remove-references-to-32kHz-cloc.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/panda/0011-panda-spidev-setup-pinmux.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/omap/sgx/0001-arm-Export-cache-flush-management-symbols-when-MULTI.patch
+
        # Patchset for Wandboard.
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/wandboard/dts/0001-imx6qdl-wandboard-dts-backport.patch
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/kernel/wandboard/dts/0002-ARM-dts-imx6qdl-wandboard-add-gpio-lines-to-wandboar.patch
diff --git a/src/patches/kernel/omap/0002-omap2-twl-common-Add-default-power-configuration.patch b/src/patches/kernel/omap/0002-omap2-twl-common-Add-default-power-configuration.patch
new file mode 100644 (file)
index 0000000..d27ad54
--- /dev/null
@@ -0,0 +1,88 @@
+From 2e908aeebd6804296e7d14a96de6be1e2de38e93 Mon Sep 17 00:00:00 2001
+From: Matthias Brugger <matthias.bgg@gmail.com>
+Date: Wed, 23 Jan 2013 19:50:38 +0100
+Subject: [PATCH 2/2] omap2: twl-common: Add default power configuration
+
+This patch adds a generic power script configuration.
+When rebooting an OMAP3530 at 125 MHz, the reboot hangs.
+With the generic power script, TWL4030 will be reset
+when a warm reset occures. This way the OMAP3530 does not
+hang on reboot.
+
+Signed-off-by: Matthias Brugger <matthias.bgg@gmail.com>
+---
+ arch/arm/mach-omap2/twl-common.c |   38 ++++++++++++++++++++++++++++++++++++++
+ arch/arm/mach-omap2/twl-common.h |    1 +
+ 2 files changed, 39 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c
+index e49b40b..f096beb 100644
+--- a/arch/arm/mach-omap2/twl-common.c
++++ b/arch/arm/mach-omap2/twl-common.c
+@@ -120,6 +120,41 @@ static struct twl4030_audio_data omap3_audio_pdata = {
+       .codec = &omap3_codec,
+ };
++static struct twl4030_ins wrst_seq[] __initdata = {
++      {MSG_SINGULAR(DEV_GRP_NULL, 0x1b, RES_STATE_OFF), 2},
++      {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_WRST), 15},
++      {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_WRST), 15},
++      {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_WRST), 0x60},
++      {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_ACTIVE), 2},
++      {MSG_SINGULAR(DEV_GRP_NULL, 0x1b, RES_STATE_ACTIVE), 2},
++};
++
++static struct twl4030_script wrst_script __initdata = {
++      .script = wrst_seq,
++      .size   = ARRAY_SIZE(wrst_seq),
++      .flags  = TWL4030_WRST_SCRIPT,
++};
++
++static struct twl4030_script *omap3_power_scripts[] __initdata = {
++      &wrst_script,
++};
++
++static struct twl4030_resconfig omap3_rconfig[] = {
++      { .resource = RES_HFCLKOUT, .devgroup = DEV_GRP_P3, .type = -1,
++              .type2 = -1 },
++      { .resource = RES_VDD1, .devgroup = DEV_GRP_P1, .type = -1,
++              .type2 = -1 },
++      { .resource = RES_VDD2, .devgroup = DEV_GRP_P1, .type = -1,
++              .type2 = -1 },
++      { 0, 0},
++};
++
++static struct twl4030_power_data omap3_power_pdata = {
++      .scripts        = omap3_power_scripts,
++      .num            = ARRAY_SIZE(omap3_power_scripts),
++      .resource_config = omap3_rconfig,
++};
++
+ static struct regulator_consumer_supply omap3_vdda_dac_supplies[] = {
+       REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"),
+ };
+@@ -224,6 +259,9 @@ void __init omap3_pmic_get_config(struct twl4030_platform_data *pmic_data,
+       if (pdata_flags & TWL_COMMON_PDATA_AUDIO && !pmic_data->audio)
+               pmic_data->audio = &omap3_audio_pdata;
++      if (pdata_flags & TWL_COMMON_PDATA_POWER && !pmic_data->power)
++              pmic_data->power = &omap3_power_pdata;
++
+       /* Common regulator configurations */
+       if (regulators_flags & TWL_COMMON_REGULATOR_VDAC && !pmic_data->vdac)
+               pmic_data->vdac = &omap3_vdac_idata;
+diff --git a/arch/arm/mach-omap2/twl-common.h b/arch/arm/mach-omap2/twl-common.h
+index dcfbad5..dbeb905 100644
+--- a/arch/arm/mach-omap2/twl-common.h
++++ b/arch/arm/mach-omap2/twl-common.h
+@@ -7,6 +7,7 @@
+ #define TWL_COMMON_PDATA_BCI          (1 << 1)
+ #define TWL_COMMON_PDATA_MADC         (1 << 2)
+ #define TWL_COMMON_PDATA_AUDIO                (1 << 3)
++#define TWL_COMMON_PDATA_POWER                (1 << 4)
+ /* Common LDO regulators for TWL4030/TWL6030 */
+ #define TWL_COMMON_REGULATOR_VDAC     (1 << 0)
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/3isp/0001-omap3isp-Use-the-common-clock-framework.patch b/src/patches/kernel/omap/3isp/0001-omap3isp-Use-the-common-clock-framework.patch
new file mode 100644 (file)
index 0000000..a61d5b8
--- /dev/null
@@ -0,0 +1,444 @@
+From 369b60c157f67a71a6f302ab9843ae2de1805a2a Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Mon, 22 Oct 2012 15:43:00 +0200
+Subject: [PATCH 1/6] omap3isp: Use the common clock framework
+
+Expose the two ISP external clocks XCLKA and XCLKB as common clocks for
+subdev drivers.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Acked-by: Mike Turquette <mturquette@linaro.org>
+---
+ drivers/media/platform/omap3isp/isp.c |  277 ++++++++++++++++++++++++---------
+ drivers/media/platform/omap3isp/isp.h |   22 ++-
+ include/media/omap3isp.h              |   10 +-
+ 3 files changed, 225 insertions(+), 84 deletions(-)
+
+diff --git a/drivers/media/platform/omap3isp/isp.c b/drivers/media/platform/omap3isp/isp.c
+index 6e5ad8e..1d7dbd5 100644
+--- a/drivers/media/platform/omap3isp/isp.c
++++ b/drivers/media/platform/omap3isp/isp.c
+@@ -55,6 +55,7 @@
+ #include <asm/cacheflush.h>
+ #include <linux/clk.h>
++#include <linux/clkdev.h>
+ #include <linux/delay.h>
+ #include <linux/device.h>
+ #include <linux/dma-mapping.h>
+@@ -148,6 +149,201 @@ void omap3isp_flush(struct isp_device *isp)
+       isp_reg_readl(isp, OMAP3_ISP_IOMEM_MAIN, ISP_REVISION);
+ }
++/* -----------------------------------------------------------------------------
++ * XCLK
++ */
++
++#define to_isp_xclk(_hw)      container_of(_hw, struct isp_xclk, hw)
++
++static void isp_xclk_update(struct isp_xclk *xclk, u32 divider)
++{
++      switch (xclk->id) {
++      case ISP_XCLK_A:
++              isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
++                              ISPTCTRL_CTRL_DIVA_MASK,
++                              divider << ISPTCTRL_CTRL_DIVA_SHIFT);
++              break;
++      case ISP_XCLK_B:
++              isp_reg_clr_set(xclk->isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
++                              ISPTCTRL_CTRL_DIVB_MASK,
++                              divider << ISPTCTRL_CTRL_DIVB_SHIFT);
++              break;
++      }
++}
++
++static int isp_xclk_prepare(struct clk_hw *hw)
++{
++      struct isp_xclk *xclk = to_isp_xclk(hw);
++
++      omap3isp_get(xclk->isp);
++
++      return 0;
++}
++
++static void isp_xclk_unprepare(struct clk_hw *hw)
++{
++      struct isp_xclk *xclk = to_isp_xclk(hw);
++
++      omap3isp_put(xclk->isp);
++}
++
++static int isp_xclk_enable(struct clk_hw *hw)
++{
++      struct isp_xclk *xclk = to_isp_xclk(hw);
++      unsigned long flags;
++
++      spin_lock_irqsave(&xclk->lock, flags);
++      isp_xclk_update(xclk, xclk->divider);
++      xclk->enabled = true;
++      spin_unlock_irqrestore(&xclk->lock, flags);
++
++      return 0;
++}
++
++static void isp_xclk_disable(struct clk_hw *hw)
++{
++      struct isp_xclk *xclk = to_isp_xclk(hw);
++      unsigned long flags;
++
++      spin_lock_irqsave(&xclk->lock, flags);
++      isp_xclk_update(xclk, 0);
++      xclk->enabled = false;
++      spin_unlock_irqrestore(&xclk->lock, flags);
++}
++
++static unsigned long isp_xclk_recalc_rate(struct clk_hw *hw,
++                                        unsigned long parent_rate)
++{
++      struct isp_xclk *xclk = to_isp_xclk(hw);
++
++      return parent_rate / xclk->divider;
++}
++
++static u32 isp_xclk_calc_divider(unsigned long *rate, unsigned long parent_rate)
++{
++      u32 divider;
++
++      if (*rate >= parent_rate) {
++              *rate = parent_rate;
++              return ISPTCTRL_CTRL_DIV_BYPASS;
++      }
++
++      divider = DIV_ROUND_CLOSEST(parent_rate, *rate);
++      if (divider >= ISPTCTRL_CTRL_DIV_BYPASS)
++              divider = ISPTCTRL_CTRL_DIV_BYPASS - 1;
++
++      *rate = parent_rate / divider;
++      return divider;
++}
++
++static long isp_xclk_round_rate(struct clk_hw *hw, unsigned long rate,
++                              unsigned long *parent_rate)
++{
++      isp_xclk_calc_divider(&rate, *parent_rate);
++      return rate;
++}
++
++static int isp_xclk_set_rate(struct clk_hw *hw, unsigned long rate,
++                           unsigned long parent_rate)
++{
++      struct isp_xclk *xclk = to_isp_xclk(hw);
++      unsigned long flags;
++      u32 divider;
++
++      divider = isp_xclk_calc_divider(&rate, parent_rate);
++
++      spin_lock_irqsave(&xclk->lock, flags);
++
++      xclk->divider = divider;
++      if (xclk->enabled)
++              isp_xclk_update(xclk, divider);
++
++      spin_unlock_irqrestore(&xclk->lock, flags);
++
++      dev_dbg(xclk->isp->dev, "%s: cam_xclk%c set to %lu Hz (div %u)\n",
++              __func__, xclk->id == ISP_XCLK_A ? 'a' : 'b', rate, divider);
++      return 0;
++}
++
++static const struct clk_ops isp_xclk_ops = {
++      .prepare = isp_xclk_prepare,
++      .unprepare = isp_xclk_unprepare,
++      .enable = isp_xclk_enable,
++      .disable = isp_xclk_disable,
++      .recalc_rate = isp_xclk_recalc_rate,
++      .round_rate = isp_xclk_round_rate,
++      .set_rate = isp_xclk_set_rate,
++};
++
++static const char *isp_xclk_parent_name = "cam_mclk";
++
++static const struct clk_init_data isp_xclk_init_data = {
++      .name = "cam_xclk",
++      .ops = &isp_xclk_ops,
++      .parent_names = &isp_xclk_parent_name,
++      .num_parents = 1,
++};
++
++static int isp_xclk_init(struct isp_device *isp)
++{
++      struct isp_platform_data *pdata = isp->pdata;
++      struct clk_init_data init;
++      unsigned int i;
++
++      for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) {
++              struct isp_xclk *xclk = &isp->xclks[i];
++              struct clk *clk;
++
++              xclk->isp = isp;
++              xclk->id = i == 0 ? ISP_XCLK_A : ISP_XCLK_B;
++              xclk->divider = 1;
++              spin_lock_init(&xclk->lock);
++
++              init.name = i == 0 ? "cam_xclka" : "cam_xclkb";
++              init.ops = &isp_xclk_ops;
++              init.parent_names = &isp_xclk_parent_name;
++              init.num_parents = 1;
++
++              xclk->hw.init = &init;
++
++              clk = devm_clk_register(isp->dev, &xclk->hw);
++              if (IS_ERR(clk))
++                      return PTR_ERR(clk);
++
++              if (pdata->xclks[i].con_id == NULL &&
++                  pdata->xclks[i].dev_id == NULL)
++                      continue;
++
++              xclk->lookup = kzalloc(sizeof(*xclk->lookup), GFP_KERNEL);
++              if (xclk->lookup == NULL)
++                      return -ENOMEM;
++
++              xclk->lookup->con_id = pdata->xclks[i].con_id;
++              xclk->lookup->dev_id = pdata->xclks[i].dev_id;
++              xclk->lookup->clk = clk;
++
++              clkdev_add(xclk->lookup);
++      }
++
++      return 0;
++}
++
++static void isp_xclk_cleanup(struct isp_device *isp)
++{
++      unsigned int i;
++
++      for (i = 0; i < ARRAY_SIZE(isp->xclks); ++i) {
++              struct isp_xclk *xclk = &isp->xclks[i];
++
++              if (xclk->lookup)
++                      clkdev_drop(xclk->lookup);
++      }
++}
++
++/* -----------------------------------------------------------------------------
++ * Interrupts
++ */
++
+ /*
+  * isp_enable_interrupts - Enable ISP interrupts.
+  * @isp: OMAP3 ISP device
+@@ -180,80 +376,6 @@ static void isp_disable_interrupts(struct isp_device *isp)
+       isp_reg_writel(isp, 0, OMAP3_ISP_IOMEM_MAIN, ISP_IRQ0ENABLE);
+ }
+-/**
+- * isp_set_xclk - Configures the specified cam_xclk to the desired frequency.
+- * @isp: OMAP3 ISP device
+- * @xclk: Desired frequency of the clock in Hz. 0 = stable low, 1 is stable high
+- * @xclksel: XCLK to configure (0 = A, 1 = B).
+- *
+- * Configures the specified MCLK divisor in the ISP timing control register
+- * (TCTRL_CTRL) to generate the desired xclk clock value.
+- *
+- * Divisor = cam_mclk_hz / xclk
+- *
+- * Returns the final frequency that is actually being generated
+- **/
+-static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel)
+-{
+-      u32 divisor;
+-      u32 currentxclk;
+-      unsigned long mclk_hz;
+-
+-      if (!omap3isp_get(isp))
+-              return 0;
+-
+-      mclk_hz = clk_get_rate(isp->clock[ISP_CLK_CAM_MCLK]);
+-
+-      if (xclk >= mclk_hz) {
+-              divisor = ISPTCTRL_CTRL_DIV_BYPASS;
+-              currentxclk = mclk_hz;
+-      } else if (xclk >= 2) {
+-              divisor = mclk_hz / xclk;
+-              if (divisor >= ISPTCTRL_CTRL_DIV_BYPASS)
+-                      divisor = ISPTCTRL_CTRL_DIV_BYPASS - 1;
+-              currentxclk = mclk_hz / divisor;
+-      } else {
+-              divisor = xclk;
+-              currentxclk = 0;
+-      }
+-
+-      switch (xclksel) {
+-      case ISP_XCLK_A:
+-              isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
+-                              ISPTCTRL_CTRL_DIVA_MASK,
+-                              divisor << ISPTCTRL_CTRL_DIVA_SHIFT);
+-              dev_dbg(isp->dev, "isp_set_xclk(): cam_xclka set to %d Hz\n",
+-                      currentxclk);
+-              break;
+-      case ISP_XCLK_B:
+-              isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
+-                              ISPTCTRL_CTRL_DIVB_MASK,
+-                              divisor << ISPTCTRL_CTRL_DIVB_SHIFT);
+-              dev_dbg(isp->dev, "isp_set_xclk(): cam_xclkb set to %d Hz\n",
+-                      currentxclk);
+-              break;
+-      case ISP_XCLK_NONE:
+-      default:
+-              omap3isp_put(isp);
+-              dev_dbg(isp->dev, "ISP_ERR: isp_set_xclk(): Invalid requested "
+-                      "xclk. Must be 0 (A) or 1 (B).\n");
+-              return -EINVAL;
+-      }
+-
+-      /* Do we go from stable whatever to clock? */
+-      if (divisor >= 2 && isp->xclk_divisor[xclksel - 1] < 2)
+-              omap3isp_get(isp);
+-      /* Stopping the clock. */
+-      else if (divisor < 2 && isp->xclk_divisor[xclksel - 1] >= 2)
+-              omap3isp_put(isp);
+-
+-      isp->xclk_divisor[xclksel - 1] = divisor;
+-
+-      omap3isp_put(isp);
+-
+-      return currentxclk;
+-}
+-
+ /*
+  * isp_core_init - ISP core settings
+  * @isp: OMAP3 ISP device
+@@ -1969,6 +2091,7 @@ static int isp_remove(struct platform_device *pdev)
+       isp_unregister_entities(isp);
+       isp_cleanup_modules(isp);
++      isp_xclk_cleanup(isp);
+       __omap3isp_get(isp, false);
+       iommu_detach_device(isp->domain, &pdev->dev);
+@@ -2042,7 +2165,6 @@ static int isp_probe(struct platform_device *pdev)
+       }
+       isp->autoidle = autoidle;
+-      isp->platform_cb.set_xclk = isp_set_xclk;
+       mutex_init(&isp->isp_mutex);
+       spin_lock_init(&isp->stat_lock);
+@@ -2093,6 +2215,10 @@ static int isp_probe(struct platform_device *pdev)
+       if (ret < 0)
+               goto error_isp;
++      ret = isp_xclk_init(isp);
++      if (ret < 0)
++              goto error_isp;
++
+       /* Memory resources */
+       for (m = 0; m < ARRAY_SIZE(isp_res_maps); m++)
+               if (isp->revision == isp_res_maps[m].isp_rev)
+@@ -2162,6 +2288,7 @@ detach_dev:
+ free_domain:
+       iommu_domain_free(isp->domain);
+ error_isp:
++      isp_xclk_cleanup(isp);
+       omap3isp_put(isp);
+ error:
+       platform_set_drvdata(pdev, NULL);
+diff --git a/drivers/media/platform/omap3isp/isp.h b/drivers/media/platform/omap3isp/isp.h
+index c77e1f2..cd3eff4 100644
+--- a/drivers/media/platform/omap3isp/isp.h
++++ b/drivers/media/platform/omap3isp/isp.h
+@@ -29,6 +29,7 @@
+ #include <media/omap3isp.h>
+ #include <media/v4l2-device.h>
++#include <linux/clk-provider.h>
+ #include <linux/device.h>
+ #include <linux/io.h>
+ #include <linux/iommu.h>
+@@ -125,8 +126,20 @@ struct isp_reg {
+       u32 val;
+ };
+-struct isp_platform_callback {
+-      u32 (*set_xclk)(struct isp_device *isp, u32 xclk, u8 xclksel);
++enum isp_xclk_id {
++      ISP_XCLK_A,
++      ISP_XCLK_B,
++};
++
++struct isp_xclk {
++      struct isp_device *isp;
++      struct clk_hw hw;
++      struct clk_lookup *lookup;
++      enum isp_xclk_id id;
++
++      spinlock_t lock;        /* Protects enabled and divider */
++      bool enabled;
++      unsigned int divider;
+ };
+ /*
+@@ -149,6 +162,7 @@ struct isp_platform_callback {
+  * @cam_mclk: Pointer to camera functional clock structure.
+  * @csi2_fck: Pointer to camera CSI2 complexIO clock structure.
+  * @l3_ick: Pointer to OMAP3 L3 bus interface clock.
++ * @xclks: External clocks provided by the ISP
+  * @irq: Currently attached ISP ISR callbacks information structure.
+  * @isp_af: Pointer to current settings for ISP AutoFocus SCM.
+  * @isp_hist: Pointer to current settings for ISP Histogram SCM.
+@@ -185,12 +199,12 @@ struct isp_device {
+       int has_context;
+       int ref_count;
+       unsigned int autoidle;
+-      u32 xclk_divisor[2];    /* Two clocks, a and b. */
+ #define ISP_CLK_CAM_ICK               0
+ #define ISP_CLK_CAM_MCLK      1
+ #define ISP_CLK_CSI2_FCK      2
+ #define ISP_CLK_L3_ICK                3
+       struct clk *clock[4];
++      struct isp_xclk xclks[2];
+       /* ISP modules */
+       struct ispstat isp_af;
+@@ -209,8 +223,6 @@ struct isp_device {
+       unsigned int subclk_resources;
+       struct iommu_domain *domain;
+-
+-      struct isp_platform_callback platform_cb;
+ };
+ #define v4l2_dev_to_isp_device(dev) \
+diff --git a/include/media/omap3isp.h b/include/media/omap3isp.h
+index 9584269..c9d06d9 100644
+--- a/include/media/omap3isp.h
++++ b/include/media/omap3isp.h
+@@ -29,10 +29,6 @@
+ struct i2c_board_info;
+ struct isp_device;
+-#define ISP_XCLK_NONE                 0
+-#define ISP_XCLK_A                    1
+-#define ISP_XCLK_B                    2
+-
+ enum isp_interface_type {
+       ISP_INTERFACE_PARALLEL,
+       ISP_INTERFACE_CSI2A_PHY2,
+@@ -153,7 +149,13 @@ struct isp_v4l2_subdevs_group {
+       } bus; /* gcc < 4.6.0 chokes on anonymous union initializers */
+ };
++struct isp_platform_xclk {
++      const char *dev_id;
++      const char *con_id;
++};
++
+ struct isp_platform_data {
++      struct isp_platform_xclk xclks[2];
+       struct isp_v4l2_subdevs_group *subdevs;
+       void (*set_constraints)(struct isp_device *isp, bool enable);
+ };
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/3isp/0002-mt9m032-Fix-PLL-setup.patch b/src/patches/kernel/omap/3isp/0002-mt9m032-Fix-PLL-setup.patch
new file mode 100644 (file)
index 0000000..9d2b19c
--- /dev/null
@@ -0,0 +1,91 @@
+From 7c44c8a989ad01bd7cd02370d4ca4a742db218be Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Tue, 25 Sep 2012 15:46:34 +0200
+Subject: [PATCH 2/6] mt9m032: Fix PLL setup
+
+The MT9M032 PLL was assumed to be identical to the MT9P031 PLL but
+differs significantly. Update the registers definitions and PLL limits
+according to the datasheet.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+---
+ drivers/media/i2c/mt9m032.c |   24 +++++++++++++-----------
+ 1 file changed, 13 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/media/i2c/mt9m032.c b/drivers/media/i2c/mt9m032.c
+index f80c1d7e..30d755a 100644
+--- a/drivers/media/i2c/mt9m032.c
++++ b/drivers/media/i2c/mt9m032.c
+@@ -87,7 +87,7 @@
+ #define MT9M032_RESTART                                       0x0b
+ #define MT9M032_RESET                                 0x0d
+ #define MT9M032_PLL_CONFIG1                           0x11
+-#define               MT9M032_PLL_CONFIG1_OUTDIV_MASK         0x3f
++#define               MT9M032_PLL_CONFIG1_PREDIV_MASK         0x3f
+ #define               MT9M032_PLL_CONFIG1_MUL_SHIFT           8
+ #define MT9M032_READ_MODE1                            0x1e
+ #define MT9M032_READ_MODE2                            0x20
+@@ -106,6 +106,8 @@
+ #define               MT9M032_GAIN_AMUL_SHIFT                 6
+ #define               MT9M032_GAIN_ANALOG_MASK                0x3f
+ #define MT9M032_FORMATTER1                            0x9e
++#define               MT9M032_FORMATTER1_PLL_P1_6             (1 << 8)
++#define               MT9M032_FORMATTER1_PARALLEL             (1 << 12)
+ #define MT9M032_FORMATTER2                            0x9f
+ #define               MT9M032_FORMATTER2_DOUT_EN              0x1000
+ #define               MT9M032_FORMATTER2_PIXCLK_EN            0x2000
+@@ -121,8 +123,6 @@
+ #define               MT9P031_PLL_CONTROL_PWROFF              0x0050
+ #define               MT9P031_PLL_CONTROL_PWRON               0x0051
+ #define               MT9P031_PLL_CONTROL_USEPLL              0x0052
+-#define MT9P031_PLL_CONFIG2                           0x11
+-#define               MT9P031_PLL_CONFIG2_P1_DIV_MASK         0x1f
+ struct mt9m032 {
+       struct v4l2_subdev subdev;
+@@ -255,13 +255,14 @@ static int mt9m032_setup_pll(struct mt9m032 *sensor)
+               .n_max = 64,
+               .m_min = 16,
+               .m_max = 255,
+-              .p1_min = 1,
+-              .p1_max = 128,
++              .p1_min = 6,
++              .p1_max = 7,
+       };
+       struct i2c_client *client = v4l2_get_subdevdata(&sensor->subdev);
+       struct mt9m032_platform_data *pdata = sensor->pdata;
+       struct aptina_pll pll;
++      u16 reg_val;
+       int ret;
+       pll.ext_clock = pdata->ext_clock;
+@@ -274,18 +275,19 @@ static int mt9m032_setup_pll(struct mt9m032 *sensor)
+       sensor->pix_clock = pdata->pix_clock;
+       ret = mt9m032_write(client, MT9M032_PLL_CONFIG1,
+-                          (pll.m << MT9M032_PLL_CONFIG1_MUL_SHIFT)
+-                          | (pll.p1 - 1));
+-      if (!ret)
+-              ret = mt9m032_write(client, MT9P031_PLL_CONFIG2, pll.n - 1);
++                          (pll.m << MT9M032_PLL_CONFIG1_MUL_SHIFT) |
++                          ((pll.n - 1) & MT9M032_PLL_CONFIG1_PREDIV_MASK));
+       if (!ret)
+               ret = mt9m032_write(client, MT9P031_PLL_CONTROL,
+                                   MT9P031_PLL_CONTROL_PWRON |
+                                   MT9P031_PLL_CONTROL_USEPLL);
+       if (!ret)               /* more reserved, Continuous, Master Mode */
+               ret = mt9m032_write(client, MT9M032_READ_MODE1, 0x8006);
+-      if (!ret)               /* Set 14-bit mode, select 7 divider */
+-              ret = mt9m032_write(client, MT9M032_FORMATTER1, 0x111e);
++      if (!ret) {
++              reg_val = (pll.p1 == 6 ? MT9M032_FORMATTER1_PLL_P1_6 : 0)
++                      | MT9M032_FORMATTER1_PARALLEL | 0x001e; /* 14-bit */
++              ret = mt9m032_write(client, MT9M032_FORMATTER1, reg_val);
++      }
+       return ret;
+ }
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/3isp/0003-mt9m032-Define-MT9M032_READ_MODE1-bits.patch b/src/patches/kernel/omap/3isp/0003-mt9m032-Define-MT9M032_READ_MODE1-bits.patch
new file mode 100644 (file)
index 0000000..c80e876
--- /dev/null
@@ -0,0 +1,55 @@
+From 1115becbb4875d62abb10f94a9510c81f376606f Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Wed, 26 Sep 2012 10:54:17 +0200
+Subject: [PATCH 3/6] mt9m032: Define MT9M032_READ_MODE1 bits
+
+Replace hardcoded values with #define's.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+---
+ drivers/media/i2c/mt9m032.c |   22 +++++++++++++++++++++-
+ 1 file changed, 21 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/media/i2c/mt9m032.c b/drivers/media/i2c/mt9m032.c
+index 30d755a..de150d3 100644
+--- a/drivers/media/i2c/mt9m032.c
++++ b/drivers/media/i2c/mt9m032.c
+@@ -90,6 +90,24 @@
+ #define               MT9M032_PLL_CONFIG1_PREDIV_MASK         0x3f
+ #define               MT9M032_PLL_CONFIG1_MUL_SHIFT           8
+ #define MT9M032_READ_MODE1                            0x1e
++#define               MT9M032_READ_MODE1_OUTPUT_BAD_FRAMES    (1 << 13)
++#define               MT9M032_READ_MODE1_MAINTAIN_FRAME_RATE  (1 << 12)
++#define               MT9M032_READ_MODE1_XOR_LINE_VALID       (1 << 11)
++#define               MT9M032_READ_MODE1_CONT_LINE_VALID      (1 << 10)
++#define               MT9M032_READ_MODE1_INVERT_TRIGGER       (1 << 9)
++#define               MT9M032_READ_MODE1_SNAPSHOT             (1 << 8)
++#define               MT9M032_READ_MODE1_GLOBAL_RESET         (1 << 7)
++#define               MT9M032_READ_MODE1_BULB_EXPOSURE        (1 << 6)
++#define               MT9M032_READ_MODE1_INVERT_STROBE        (1 << 5)
++#define               MT9M032_READ_MODE1_STROBE_ENABLE        (1 << 4)
++#define               MT9M032_READ_MODE1_STROBE_START_TRIG1   (0 << 2)
++#define               MT9M032_READ_MODE1_STROBE_START_EXP     (1 << 2)
++#define               MT9M032_READ_MODE1_STROBE_START_SHUTTER (2 << 2)
++#define               MT9M032_READ_MODE1_STROBE_START_TRIG2   (3 << 2)
++#define               MT9M032_READ_MODE1_STROBE_END_TRIG1     (0 << 0)
++#define               MT9M032_READ_MODE1_STROBE_END_EXP       (1 << 0)
++#define               MT9M032_READ_MODE1_STROBE_END_SHUTTER   (2 << 0)
++#define               MT9M032_READ_MODE1_STROBE_END_TRIG2     (3 << 0)
+ #define MT9M032_READ_MODE2                            0x20
+ #define               MT9M032_READ_MODE2_VFLIP_SHIFT          15
+ #define               MT9M032_READ_MODE2_HFLIP_SHIFT          14
+@@ -282,7 +300,9 @@ static int mt9m032_setup_pll(struct mt9m032 *sensor)
+                                   MT9P031_PLL_CONTROL_PWRON |
+                                   MT9P031_PLL_CONTROL_USEPLL);
+       if (!ret)               /* more reserved, Continuous, Master Mode */
+-              ret = mt9m032_write(client, MT9M032_READ_MODE1, 0x8006);
++              ret = mt9m032_write(client, MT9M032_READ_MODE1, 0x8000 |
++                                  MT9M032_READ_MODE1_STROBE_START_EXP |
++                                  MT9M032_READ_MODE1_STROBE_END_SHUTTER);
+       if (!ret) {
+               reg_val = (pll.p1 == 6 ? MT9M032_FORMATTER1_PLL_P1_6 : 0)
+                       | MT9M032_FORMATTER1_PARALLEL | 0x001e; /* 14-bit */
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/3isp/0004-mt9p031-Use-devm_-managed-helpers.patch b/src/patches/kernel/omap/3isp/0004-mt9p031-Use-devm_-managed-helpers.patch
new file mode 100644 (file)
index 0000000..bcc4360
--- /dev/null
@@ -0,0 +1,62 @@
+From d3f188f38eaa34acf6375d5d88fe27971aae1170 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Fri, 21 Dec 2012 20:34:06 +0100
+Subject: [PATCH 4/6] mt9p031: Use devm_* managed helpers
+
+Replace kzalloc and gpio_request_one by their managed equivalents.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+---
+ drivers/media/i2c/mt9p031.c |   13 +++----------
+ 1 file changed, 3 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c
+index e328332..e0bad59 100644
+--- a/drivers/media/i2c/mt9p031.c
++++ b/drivers/media/i2c/mt9p031.c
+@@ -927,7 +927,7 @@ static int mt9p031_probe(struct i2c_client *client,
+               return -EIO;
+       }
+-      mt9p031 = kzalloc(sizeof(*mt9p031), GFP_KERNEL);
++      mt9p031 = devm_kzalloc(&client->dev, sizeof(*mt9p031), GFP_KERNEL);
+       if (mt9p031 == NULL)
+               return -ENOMEM;
+@@ -1001,8 +1001,8 @@ static int mt9p031_probe(struct i2c_client *client,
+       mt9p031->format.colorspace = V4L2_COLORSPACE_SRGB;
+       if (pdata->reset != -1) {
+-              ret = gpio_request_one(pdata->reset, GPIOF_OUT_INIT_LOW,
+-                                     "mt9p031_rst");
++              ret = devm_gpio_request_one(&client->dev, pdata->reset,
++                                          GPIOF_OUT_INIT_LOW, "mt9p031_rst");
+               if (ret < 0)
+                       goto done;
+@@ -1013,12 +1013,8 @@ static int mt9p031_probe(struct i2c_client *client,
+ done:
+       if (ret < 0) {
+-              if (mt9p031->reset != -1)
+-                      gpio_free(mt9p031->reset);
+-
+               v4l2_ctrl_handler_free(&mt9p031->ctrls);
+               media_entity_cleanup(&mt9p031->subdev.entity);
+-              kfree(mt9p031);
+       }
+       return ret;
+@@ -1032,9 +1028,6 @@ static int mt9p031_remove(struct i2c_client *client)
+       v4l2_ctrl_handler_free(&mt9p031->ctrls);
+       v4l2_device_unregister_subdev(subdev);
+       media_entity_cleanup(&subdev->entity);
+-      if (mt9p031->reset != -1)
+-              gpio_free(mt9p031->reset);
+-      kfree(mt9p031);
+       return 0;
+ }
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/3isp/0005-mt9p031-Add-support-for-regulators.patch b/src/patches/kernel/omap/3isp/0005-mt9p031-Add-support-for-regulators.patch
new file mode 100644 (file)
index 0000000..57c80fd
--- /dev/null
@@ -0,0 +1,82 @@
+From 9ff2bc0c9458f0eecde6d9b52a899fd2bb1dd3a3 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Tue, 8 May 2012 15:10:36 +0200
+Subject: [PATCH 5/6] mt9p031: Add support for regulators
+
+Enable the regulators when powering the sensor up, and disable them when
+powering it down.
+
+The regulators are mandatory. Boards that don't allow controlling the
+sensor power lines must provide fixed voltage regulators.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+---
+ drivers/media/i2c/mt9p031.c |   24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c
+index e0bad59..ecf4492 100644
+--- a/drivers/media/i2c/mt9p031.c
++++ b/drivers/media/i2c/mt9p031.c
+@@ -19,6 +19,7 @@
+ #include <linux/i2c.h>
+ #include <linux/log2.h>
+ #include <linux/pm.h>
++#include <linux/regulator/consumer.h>
+ #include <linux/slab.h>
+ #include <linux/videodev2.h>
+@@ -121,6 +122,10 @@ struct mt9p031 {
+       struct mutex power_lock; /* lock to protect power_count */
+       int power_count;
++      struct regulator *vaa;
++      struct regulator *vdd;
++      struct regulator *vdd_io;
++
+       enum mt9p031_model model;
+       struct aptina_pll pll;
+       int reset;
+@@ -264,6 +269,11 @@ static int mt9p031_power_on(struct mt9p031 *mt9p031)
+               usleep_range(1000, 2000);
+       }
++      /* Bring up the supplies */
++      regulator_enable(mt9p031->vdd);
++      regulator_enable(mt9p031->vdd_io);
++      regulator_enable(mt9p031->vaa);
++
+       /* Emable clock */
+       if (mt9p031->pdata->set_xclk)
+               mt9p031->pdata->set_xclk(&mt9p031->subdev,
+@@ -285,6 +295,10 @@ static void mt9p031_power_off(struct mt9p031 *mt9p031)
+               usleep_range(1000, 2000);
+       }
++      regulator_disable(mt9p031->vaa);
++      regulator_disable(mt9p031->vdd_io);
++      regulator_disable(mt9p031->vdd);
++
+       if (mt9p031->pdata->set_xclk)
+               mt9p031->pdata->set_xclk(&mt9p031->subdev, 0);
+ }
+@@ -937,6 +951,16 @@ static int mt9p031_probe(struct i2c_client *client,
+       mt9p031->model = did->driver_data;
+       mt9p031->reset = -1;
++      mt9p031->vaa = devm_regulator_get(&client->dev, "vaa");
++      mt9p031->vdd = devm_regulator_get(&client->dev, "vdd");
++      mt9p031->vdd_io = devm_regulator_get(&client->dev, "vdd_io");
++
++      if (IS_ERR(mt9p031->vaa) || IS_ERR(mt9p031->vdd) ||
++          IS_ERR(mt9p031->vdd_io)) {
++              dev_err(&client->dev, "Unable to get regulators\n");
++              return -ENODEV;
++      }
++
+       v4l2_ctrl_handler_init(&mt9p031->ctrls, ARRAY_SIZE(mt9p031_ctrls) + 6);
+       v4l2_ctrl_new_std(&mt9p031->ctrls, &mt9p031_ctrl_ops,
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/3isp/0006-mt9p031-Use-the-common-clock-framework.patch b/src/patches/kernel/omap/3isp/0006-mt9p031-Use-the-common-clock-framework.patch
new file mode 100644 (file)
index 0000000..fc8d583
--- /dev/null
@@ -0,0 +1,110 @@
+From 6cd62f5ae305142c0490e80caa04f99f00029b68 Mon Sep 17 00:00:00 2001
+From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Date: Fri, 21 Dec 2012 20:11:55 +0100
+Subject: [PATCH 6/6] mt9p031: Use the common clock framework
+
+Configure the device external clock using the common clock framework
+instead of a board code callback function.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Acked-by: Sakari Ailus <sakari.ailus@iki.fi>
+---
+ drivers/media/i2c/mt9p031.c |   21 ++++++++++++++-------
+ include/media/mt9p031.h     |    2 --
+ 2 files changed, 14 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/media/i2c/mt9p031.c b/drivers/media/i2c/mt9p031.c
+index ecf4492..28cf95b 100644
+--- a/drivers/media/i2c/mt9p031.c
++++ b/drivers/media/i2c/mt9p031.c
+@@ -12,6 +12,7 @@
+  * published by the Free Software Foundation.
+  */
++#include <linux/clk.h>
+ #include <linux/delay.h>
+ #include <linux/device.h>
+ #include <linux/gpio.h>
+@@ -122,6 +123,7 @@ struct mt9p031 {
+       struct mutex power_lock; /* lock to protect power_count */
+       int power_count;
++      struct clk *clk;
+       struct regulator *vaa;
+       struct regulator *vdd;
+       struct regulator *vdd_io;
+@@ -200,7 +202,7 @@ static int mt9p031_reset(struct mt9p031 *mt9p031)
+                                         0);
+ }
+-static int mt9p031_pll_setup(struct mt9p031 *mt9p031)
++static int mt9p031_clk_setup(struct mt9p031 *mt9p031)
+ {
+       static const struct aptina_pll_limits limits = {
+               .ext_clock_min = 6000000,
+@@ -221,6 +223,12 @@ static int mt9p031_pll_setup(struct mt9p031 *mt9p031)
+       struct i2c_client *client = v4l2_get_subdevdata(&mt9p031->subdev);
+       struct mt9p031_platform_data *pdata = mt9p031->pdata;
++      mt9p031->clk = devm_clk_get(&client->dev, NULL);
++      if (IS_ERR(mt9p031->clk))
++              return PTR_ERR(mt9p031->clk);
++
++      clk_set_rate(mt9p031->clk, pdata->ext_freq);
++
+       mt9p031->pll.ext_clock = pdata->ext_freq;
+       mt9p031->pll.pix_clock = pdata->target_freq;
+@@ -275,9 +283,8 @@ static int mt9p031_power_on(struct mt9p031 *mt9p031)
+       regulator_enable(mt9p031->vaa);
+       /* Emable clock */
+-      if (mt9p031->pdata->set_xclk)
+-              mt9p031->pdata->set_xclk(&mt9p031->subdev,
+-                                       mt9p031->pdata->ext_freq);
++      if (mt9p031->clk)
++              clk_prepare_enable(mt9p031->clk);
+       /* Now RESET_BAR must be high */
+       if (mt9p031->reset != -1) {
+@@ -299,8 +306,8 @@ static void mt9p031_power_off(struct mt9p031 *mt9p031)
+       regulator_disable(mt9p031->vdd_io);
+       regulator_disable(mt9p031->vdd);
+-      if (mt9p031->pdata->set_xclk)
+-              mt9p031->pdata->set_xclk(&mt9p031->subdev, 0);
++      if (mt9p031->clk)
++              clk_disable_unprepare(mt9p031->clk);
+ }
+ static int __mt9p031_set_power(struct mt9p031 *mt9p031, bool on)
+@@ -1033,7 +1040,7 @@ static int mt9p031_probe(struct i2c_client *client,
+               mt9p031->reset = pdata->reset;
+       }
+-      ret = mt9p031_pll_setup(mt9p031);
++      ret = mt9p031_clk_setup(mt9p031);
+ done:
+       if (ret < 0) {
+diff --git a/include/media/mt9p031.h b/include/media/mt9p031.h
+index 0c97b19..b1e63f2 100644
+--- a/include/media/mt9p031.h
++++ b/include/media/mt9p031.h
+@@ -5,13 +5,11 @@ struct v4l2_subdev;
+ /*
+  * struct mt9p031_platform_data - MT9P031 platform data
+- * @set_xclk: Clock frequency set callback
+  * @reset: Chip reset GPIO (set to -1 if not used)
+  * @ext_freq: Input clock frequency
+  * @target_freq: Pixel clock frequency
+  */
+ struct mt9p031_platform_data {
+-      int (*set_xclk)(struct v4l2_subdev *subdev, int hz);
+       int reset;
+       int ext_freq;
+       int target_freq;
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/0001-meego-modedb-add-Toshiba-LTA070B220F-800x480-support.patch b/src/patches/kernel/omap/beagle/0001-meego-modedb-add-Toshiba-LTA070B220F-800x480-support.patch
new file mode 100644 (file)
index 0000000..34d6034
--- /dev/null
@@ -0,0 +1,30 @@
+From 6ac98647956cbff190954b4cac6bd71fdbb8647b Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Wed, 23 Mar 2011 08:37:54 -0500
+Subject: [PATCH 1/5] meego: modedb add Toshiba LTA070B220F 800x480 support
+
+ from http://wiki.meego.com/ARM/Meego_on_Beagleboard_from_scratch
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/video/modedb.c |    4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
+index 5b686de..69ad1ec 100644
+--- a/drivers/video/modedb.c
++++ b/drivers/video/modedb.c
+@@ -293,6 +293,10 @@ static const struct fb_videomode modedb[] = {
+       /* 864x480 @ 60 Hz, 35.15 kHz hsync */
+       { NULL, 60, 864, 480, 27777, 1, 1, 1, 1, 0, 0,
+               0, FB_VMODE_NONINTERLACED },
++
++      /* 800x480 @ 60 Hz, Toshiba LTA070B220F 7 inch LCD */
++      {  NULL, 60, 800, 480, 32787, 48, 80, 33, 31, 32, 2,
++              FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED },
+ };
+ #ifdef CONFIG_FB_MODE_HELPERS
+-- 
+1.7.7.6
+
diff --git a/src/patches/kernel/omap/beagle/0002-backlight-Add-TLC59108-backlight-control-driver.patch b/src/patches/kernel/omap/beagle/0002-backlight-Add-TLC59108-backlight-control-driver.patch
new file mode 100644 (file)
index 0000000..ce4df82
--- /dev/null
@@ -0,0 +1,217 @@
+From e989473bea15beef8d480b822a619e7b8fca860c Mon Sep 17 00:00:00 2001
+From: "Manjunathappa, Prakash" <prakash.pm@ti.com>
+Date: Mon, 1 Aug 2011 18:25:11 +0530
+Subject: [PATCH 2/5] backlight: Add TLC59108 backlight control driver
+
+This patch adds support for I2C configurable TLC59108 backlight
+control driver.
+
+Signed-off-by: Manjunathappa, Prakash <prakash.pm@ti.com>
+Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
+---
+ drivers/video/backlight/Kconfig    |    8 ++
+ drivers/video/backlight/Makefile   |    1 +
+ drivers/video/backlight/tlc59108.c |  160 ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 169 insertions(+)
+ create mode 100644 drivers/video/backlight/tlc59108.c
+
+diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
+index db10d01..04a2275 100644
+--- a/drivers/video/backlight/Kconfig
++++ b/drivers/video/backlight/Kconfig
+@@ -418,6 +418,14 @@ config BACKLIGHT_AS3711
+         If you have an Austrian Microsystems AS3711 say Y to enable the
+         backlight driver.
++config BACKLIGHT_TLC59108
++      tristate "TLC59108 LCD Backlight Driver"
++      depends on I2C && BACKLIGHT_CLASS_DEVICE
++      default n
++      help
++        If you have an LCD Panel with backlight control via TLC59108,
++        say Y to enable its LCD control driver.
++
+ endif # BACKLIGHT_CLASS_DEVICE
+ endif # BACKLIGHT_LCD_SUPPORT
+diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
+index 96c4d62..3687852 100644
+--- a/drivers/video/backlight/Makefile
++++ b/drivers/video/backlight/Makefile
+@@ -41,6 +41,7 @@ obj-$(CONFIG_BACKLIGHT_LP855X)               += lp855x_bl.o
+ obj-$(CONFIG_BACKLIGHT_LP8788)                += lp8788_bl.o
+ obj-$(CONFIG_BACKLIGHT_MAX8925)               += max8925_bl.o
+ obj-$(CONFIG_BACKLIGHT_OMAP1)         += omap1_bl.o
++obj-$(CONFIG_BACKLIGHT_TLC59108)      += tlc59108.o
+ obj-$(CONFIG_BACKLIGHT_OT200)         += ot200_bl.o
+ obj-$(CONFIG_BACKLIGHT_PANDORA)               += pandora_bl.o
+ obj-$(CONFIG_BACKLIGHT_PCF50633)      += pcf50633-backlight.o
+diff --git a/drivers/video/backlight/tlc59108.c b/drivers/video/backlight/tlc59108.c
+new file mode 100644
+index 0000000..4f4ea34
+--- /dev/null
++++ b/drivers/video/backlight/tlc59108.c
+@@ -0,0 +1,160 @@
++/*
++ * ti81xxhdmi_tlc59108.c
++ *
++ * Copyright (C) 2011 Texas Instruments
++ * Author: Senthil Natarajan
++ *
++ * tlc59108 HDMI Driver
++ *
++ * 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 published by
++ * the Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program.  If not, see <http://www.gnu.org/licenses/>.
++ * History:
++ *
++ * Senthil Natarajan<senthil.n@ti.com> July 2011 I2C driver for tlc59108
++ *                                             backlight control
++ */
++
++#include <linux/i2c.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/backlight.h>
++#include <linux/fb.h>
++
++#define tlc59108_MODULE_NAME  "tlc59108"
++#define TLC59108_MODE1   0x00
++#define TLC59108_PWM2    0x04
++#define TLC59108_LEDOUT0 0x0c
++#define TLC59108_LEDOUT1 0x0d
++#define TLC59108_MAX_BRIGHTNESS 0xFF
++
++struct tlc59108_bl {
++      struct i2c_client *client;
++      struct backlight_device *bl;
++};
++
++static void tlc59108_bl_set_backlight(struct tlc59108_bl *data, int brightness)
++{
++      /* Set Mode1 Register */
++      i2c_smbus_write_byte_data(data->client, TLC59108_MODE1, 0x00);
++
++      /* Set LEDOUT0 Register */
++      i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT0, 0x21);
++
++      /* Set Backlight Duty Cycle*/
++      i2c_smbus_write_byte_data(data->client, TLC59108_PWM2,
++                                brightness & 0xff);
++}
++
++static int tlc59108_bl_get_brightness(struct backlight_device *dev)
++{
++      struct backlight_properties *props = &dev->props;
++
++      return props->brightness;
++}
++
++static int tlc59108_bl_update_status(struct backlight_device *dev)
++{
++      struct backlight_properties *props = &dev->props;
++      struct tlc59108_bl *data = dev_get_drvdata(&dev->dev);
++      int brightness = props->brightness;
++
++      tlc59108_bl_set_backlight(data, brightness);
++
++      return 0;
++}
++
++static const struct backlight_ops bl_ops = {
++      .get_brightness         = tlc59108_bl_get_brightness,
++      .update_status          = tlc59108_bl_update_status,
++};
++
++static int tlc59108_probe(struct i2c_client *c, const struct i2c_device_id *id)
++{
++      struct backlight_properties props;
++      struct tlc59108_bl *data = kzalloc(sizeof(struct tlc59108_bl),
++                                         GFP_KERNEL);
++      int ret = 0;
++
++      if (!data)
++              return -ENOMEM;
++
++      i2c_set_clientdata(c, data);
++      data->client = c;
++
++      memset(&props, 0, sizeof(struct backlight_properties));
++      props.max_brightness = TLC59108_MAX_BRIGHTNESS;
++      props.type = BACKLIGHT_RAW;
++      data->bl = backlight_device_register("tlc59108-bl", &c->dev, data,
++                                           &bl_ops, &props);
++      if (IS_ERR(data->bl)) {
++              ret = PTR_ERR(data->bl);
++              goto err_reg;
++      }
++
++      data->bl->props.brightness = TLC59108_MAX_BRIGHTNESS;
++
++      backlight_update_status(data->bl);
++
++      return 0;
++
++err_reg:
++      data->bl = NULL;
++      kfree(data);
++      return ret;
++}
++
++static int tlc59108_remove(struct i2c_client *c)
++{
++      struct tlc59108_bl *data = i2c_get_clientdata(c);
++
++      backlight_device_unregister(data->bl);
++      data->bl = NULL;
++
++      kfree(data);
++
++      return 0;
++}
++
++/* I2C Device ID table */
++static const struct i2c_device_id tlc59108_id[] = {
++      { "tlc59108", 0 },
++      { }
++};
++MODULE_DEVICE_TABLE(i2c, tlc59108_id);
++
++/* I2C driver data */
++static struct i2c_driver tlc59108_driver = {
++      .driver = {
++              .owner = THIS_MODULE,
++              .name = tlc59108_MODULE_NAME,
++      },
++      .probe = tlc59108_probe,
++      .remove = tlc59108_remove,
++      .id_table = tlc59108_id,
++};
++
++static int __init tlc59108_init(void)
++{
++      return i2c_add_driver(&tlc59108_driver);
++}
++
++static void __exit tlc59108_exit(void)
++{
++      i2c_del_driver(&tlc59108_driver);
++}
++
++module_init(tlc59108_init);
++module_exit(tlc59108_exit);
++
++MODULE_DESCRIPTION("LCD/Backlight control for TLC59108");
++MODULE_AUTHOR("Senthil Natarajan <senthil.n@ti.com>");
++MODULE_LICENSE("GPL v2");
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/0003-tlc59108-adjust-for-beagleboard-uLCD7.patch b/src/patches/kernel/omap/beagle/0003-tlc59108-adjust-for-beagleboard-uLCD7.patch
new file mode 100644 (file)
index 0000000..5c9659b
--- /dev/null
@@ -0,0 +1,124 @@
+From 40cbddde06a9f0e1845810b904502f922fc3288f Mon Sep 17 00:00:00 2001
+From: Koen Kooi <koen@dominion.thruhere.net>
+Date: Fri, 27 Apr 2012 21:30:00 +0200
+Subject: [PATCH 3/5] tlc59108: adjust for beagleboard+uLCD7
+
+Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
+---
+ drivers/video/backlight/tlc59108.c |   46 ++++++++++++++++++++++++-----------
+ 1 files changed, 31 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/video/backlight/tlc59108.c b/drivers/video/backlight/tlc59108.c
+index 4f4ea34..40a21e7 100644
+--- a/drivers/video/backlight/tlc59108.c
++++ b/drivers/video/backlight/tlc59108.c
+@@ -29,9 +29,16 @@
+ #include <linux/backlight.h>
+ #include <linux/fb.h>
+-#define tlc59108_MODULE_NAME  "tlc59108"
+ #define TLC59108_MODE1   0x00
+-#define TLC59108_PWM2    0x04
++#define TLC59108_MODE2   0x01
++#define TLC59108_PWM0 0x02
++#define TLC59108_PWM1 0x03
++#define TLC59108_PWM2 0x04
++#define TLC59108_PWM3 0x05
++#define TLC59108_PWM4 0x06
++#define TLC59108_PWM5 0x07
++#define TLC59108_PWM6 0x08
++#define TLC59108_PWM7 0x09
+ #define TLC59108_LEDOUT0 0x0c
+ #define TLC59108_LEDOUT1 0x0d
+ #define TLC59108_MAX_BRIGHTNESS 0xFF
+@@ -43,15 +50,9 @@ struct tlc59108_bl {
+ static void tlc59108_bl_set_backlight(struct tlc59108_bl *data, int brightness)
+ {
+-      /* Set Mode1 Register */
+-      i2c_smbus_write_byte_data(data->client, TLC59108_MODE1, 0x00);
+-
+-      /* Set LEDOUT0 Register */
+-      i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT0, 0x21);
+-
+       /* Set Backlight Duty Cycle*/
+       i2c_smbus_write_byte_data(data->client, TLC59108_PWM2,
+-                                brightness & 0xff);
++                                0xff - brightness );
+ }
+ static int tlc59108_bl_get_brightness(struct backlight_device *dev)
+@@ -65,8 +66,18 @@ static int tlc59108_bl_update_status(struct backlight_device *dev)
+ {
+       struct backlight_properties *props = &dev->props;
+       struct tlc59108_bl *data = dev_get_drvdata(&dev->dev);
++
+       int brightness = props->brightness;
++      if (dev->props.state & BL_CORE_FBBLANK) {
++              brightness = 0;
++              /* Set LEDOUT0 Register */
++              i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT0, 0x10);
++      } else {
++              /* Set LEDOUT0 Register */
++              i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT0, 0x30);
++      }
++
+       tlc59108_bl_set_backlight(data, brightness);
+       return 0;
+@@ -77,7 +88,7 @@ static const struct backlight_ops bl_ops = {
+       .update_status          = tlc59108_bl_update_status,
+ };
+-static int tlc59108_probe(struct i2c_client *c, const struct i2c_device_id *id)
++static int __devinit tlc59108_probe(struct i2c_client *c, const struct i2c_device_id *id)
+ {
+       struct backlight_properties props;
+       struct tlc59108_bl *data = kzalloc(sizeof(struct tlc59108_bl),
+@@ -104,6 +115,11 @@ static int tlc59108_probe(struct i2c_client *c, const struct i2c_device_id *id)
+       backlight_update_status(data->bl);
++      i2c_smbus_write_byte_data(data->client, TLC59108_MODE1, 0x00);
++      i2c_smbus_write_byte_data(data->client, TLC59108_PWM2, 0x80);
++      i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT1, 0x05);
++      i2c_smbus_write_byte_data(data->client, TLC59108_LEDOUT1, 0x15);
++
+       return 0;
+ err_reg:
+@@ -125,7 +141,7 @@ static int tlc59108_remove(struct i2c_client *c)
+ }
+ /* I2C Device ID table */
+-static const struct i2c_device_id tlc59108_id[] = {
++static struct i2c_device_id tlc59108_id[] = {
+       { "tlc59108", 0 },
+       { }
+ };
+@@ -134,12 +150,12 @@ MODULE_DEVICE_TABLE(i2c, tlc59108_id);
+ /* I2C driver data */
+ static struct i2c_driver tlc59108_driver = {
+       .driver = {
+-              .owner = THIS_MODULE,
+-              .name = tlc59108_MODULE_NAME,
++              .owner  = THIS_MODULE,
++              .name   = "tlc59108"
+       },
++      .id_table = tlc59108_id,
+       .probe = tlc59108_probe,
+       .remove = tlc59108_remove,
+-      .id_table = tlc59108_id,
+ };
+ static int __init tlc59108_init(void)
+@@ -157,4 +173,4 @@ module_exit(tlc59108_exit);
+ MODULE_DESCRIPTION("LCD/Backlight control for TLC59108");
+ MODULE_AUTHOR("Senthil Natarajan <senthil.n@ti.com>");
+-MODULE_LICENSE("GPL v2");
++MODULE_LICENSE("GPL");
+-- 
+1.7.7.6
+
diff --git a/src/patches/kernel/omap/beagle/0004-zeroMAP-Open-your-eyes.patch b/src/patches/kernel/omap/beagle/0004-zeroMAP-Open-your-eyes.patch
new file mode 100644 (file)
index 0000000..d179420
--- /dev/null
@@ -0,0 +1,31 @@
+From 81ff7627ad0d958a5c156cb7d880af8707e14f47 Mon Sep 17 00:00:00 2001
+From: Alexander Holler <holler@ahsoftware.de>
+Date: Wed, 4 Jul 2012 00:03:04 +0200
+Subject: [PATCH 4/5] zeroMAP: Open your eyes!
+
+Signed-off-by: Alexander Holler <holler@ahsoftware.de>
+---
+ kernel/printk.c |    7 +++++++
+ 1 files changed, 7 insertions(+), 0 deletions(-)
+
+diff --git a/kernel/printk.c b/kernel/printk.c
+index 22e070f..3678740 100644
+--- a/kernel/printk.c
++++ b/kernel/printk.c
+@@ -1759,6 +1759,13 @@ static int __init console_setup(char *str)
+       char *s, *options, *brl_options = NULL;
+       int idx;
++#ifdef CONFIG_SERIAL_OMAP
++      if (!strncmp(str, "tty0", 4) && '0' <= str[4] && '9' >= str[4]) {
++              str[3] = 'O';
++              pr_warn("We are opening your eyes, assuming you want to use an OMAP based serial driver and not a zeroMAP based one! ;)\n");
++              pr_warn("Which means 'tty0%s' was changed to 'ttyO%s' automagically for your pleasure.\n", str+4, str+4);
++      }
++#endif
+ #ifdef CONFIG_A11Y_BRAILLE_CONSOLE
+       if (!memcmp(str, "brl,", 4)) {
+               brl_options = "";
+-- 
+1.7.7.6
+
diff --git a/src/patches/kernel/omap/beagle/0005-ARM-OMAP-Beagle-use-TWL4030-generic-reset-script.patch b/src/patches/kernel/omap/beagle/0005-ARM-OMAP-Beagle-use-TWL4030-generic-reset-script.patch
new file mode 100644 (file)
index 0000000..ffb5ffb
--- /dev/null
@@ -0,0 +1,29 @@
+From f2ec859cb99e6137d78b457f8a6693e69e3b1f33 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Thu, 24 Jan 2013 09:43:51 -0600
+Subject: [PATCH 5/5] ARM: OMAP: Beagle: use TWL4030 generic reset script
+
+Enable TWL_COMMON_PDATA_POWER such that OMAP3530 revisions of the
+Beagle (Bx/Cx) will not hang on reboot when running at 125 Mhz.
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 5b57885..9a2c80b 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -831,7 +831,7 @@ static int __init omap3_beagle_i2c_init(void)
+ {
+       omap3_pmic_get_config(&beagle_twldata,
+                       TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC |
+-                      TWL_COMMON_PDATA_AUDIO,
++                      TWL_COMMON_PDATA_AUDIO | TWL_COMMON_PDATA_POWER,
+                       TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
+       beagle_twldata.vpll2->constraints.name = "VDVI";
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/0006-DSS2-use-DSI-PLL-for-DPI-with-OMAP3.patch b/src/patches/kernel/omap/beagle/0006-DSS2-use-DSI-PLL-for-DPI-with-OMAP3.patch
new file mode 100644 (file)
index 0000000..56879cb
--- /dev/null
@@ -0,0 +1,28 @@
+From 40d889a09a05765138f3b737becadfe927c9b004 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 19 Mar 2013 13:40:50 -0500
+Subject: [PATCH 6/6] DSS2: use DSI PLL for DPI with OMAP3
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/video/omap2/dss/dpi.c |    4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
+index 757b57f..12ed14f 100644
+--- a/drivers/video/omap2/dss/dpi.c
++++ b/drivers/video/omap2/dss/dpi.c
+@@ -58,10 +58,6 @@ static struct platform_device *dpi_get_dsidev(enum omap_channel channel)
+        */
+       switch (omapdss_get_version()) {
+       case OMAPDSS_VER_OMAP24xx:
+-      case OMAPDSS_VER_OMAP34xx_ES1:
+-      case OMAPDSS_VER_OMAP34xx_ES3:
+-      case OMAPDSS_VER_OMAP3630:
+-      case OMAPDSS_VER_AM35xx:
+               return NULL;
+       case OMAPDSS_VER_OMAP4430_ES1:
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0001-Beagle-expansion-add-buddy-param-for-expansionboard-.patch b/src/patches/kernel/omap/beagle/expansion/0001-Beagle-expansion-add-buddy-param-for-expansionboard-.patch
new file mode 100644 (file)
index 0000000..44a1ae3
--- /dev/null
@@ -0,0 +1,63 @@
+From c070885eaf883884f89a77e2f71def5b447f914b Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:25:27 -0600
+Subject: [PATCH 01/10] Beagle: expansion: add buddy param for expansionboard
+ names
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |   17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index c3558f9..29d549c 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -23,6 +23,7 @@
+ #include <linux/pwm.h>
+ #include <linux/leds_pwm.h>
+ #include <linux/gpio.h>
++#include <linux/irq.h>
+ #include <linux/input.h>
+ #include <linux/gpio_keys.h>
+ #include <linux/opp.h>
+@@ -191,6 +192,8 @@ static void __init omap3_beagle_init_rev(void)
+       }
+ }
++char expansionboard_name[16];
++
+ static struct mtd_partition omap3beagle_nand_partitions[] = {
+       /* All the partition sizes are listed in terms of NAND block size */
+       {
+@@ -470,6 +473,18 @@ static struct omap_board_mux board_mux[] __initdata = {
+ };
+ #endif
++static int __init expansionboard_setup(char *str)
++{
++      if (!machine_is_omap3_beagle())
++              return 0;
++
++      if (!str)
++              return -EINVAL;
++      strncpy(expansionboard_name, str, 16);
++      pr_info("Beagle expansionboard: %s\n", expansionboard_name);
++      return 0;
++}
++
+ static int __init beagle_opp_init(void)
+ {
+       int r = 0;
+@@ -559,6 +574,8 @@ static void __init omap3_beagle_init(void)
+       pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
+ }
++early_param("buddy", expansionboard_setup);
++
+ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
+       /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */
+       .atag_offset    = 0x100,
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0002-Beagle-expansion-add-zippy.patch b/src/patches/kernel/omap/beagle/expansion/0002-Beagle-expansion-add-zippy.patch
new file mode 100644 (file)
index 0000000..fff6243
--- /dev/null
@@ -0,0 +1,242 @@
+From e71075202707e044a28604bd929fd6f7a89adeae Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Mon, 21 Jan 2013 11:47:02 -0600
+Subject: [PATCH 02/10] Beagle: expansion: add zippy
+
+v2: add #include <linux/regulator/fixed.h>
+build fix from Pantelis Antoniou <panto@antoniou-consulting.com>
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |  164 +++++++++++++++++++++++++++++--
+ 1 file changed, 158 insertions(+), 6 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 4e6e767..b3685ed 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -37,6 +37,7 @@
+ #include <linux/usb/nop-usb-xceiv.h>
+ #include <linux/regulator/machine.h>
++#include <linux/regulator/fixed.h>
+ #include <linux/i2c/twl.h>
+ #include <asm/mach-types.h>
+@@ -195,6 +196,86 @@ static void __init omap3_beagle_init_rev(void)
+ char expansionboard_name[16];
++enum {
++      EXPANSION_MMC_NONE = 0,
++      EXPANSION_MMC_ZIPPY,
++      EXPANSION_MMC_WIFI,
++};
++
++enum {
++      EXPANSION_I2C_NONE = 0,
++      EXPANSION_I2C_ZIPPY,
++};
++
++static struct {
++      int mmc_settings;
++      int i2c_settings;
++} expansion_config = {
++      .mmc_settings = EXPANSION_MMC_NONE,
++      .i2c_settings = EXPANSION_I2C_NONE,
++};
++
++//rcn-ee: this is just a fake regulator, the zippy hardware provides 3.3/1.8 with jumper..
++static struct fixed_voltage_config beagle_vzippy = {
++      .supply_name = "vzippy",
++      .microvolts = 3300000,  /* 3.3V */
++      .startup_delay = 70000, /* 70ms */
++      .enable_high = 1,
++      .enabled_at_boot = 0,
++      .init_data = &beagle_vmmc2,
++};
++
++static struct platform_device omap_zippy_device = {
++      .name   = "reg-fixed-voltage",
++      .id             = 1,
++      .dev = {
++              .platform_data = &beagle_vzippy,
++      },
++};
++
++#define OMAP3BEAGLE_GPIO_ZIPPY_MMC_WP 141
++#define OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD 162
++
++#if IS_ENABLED(CONFIG_ENC28J60)
++#include <linux/platform_data/spi-omap2-mcspi.h>
++#include <linux/spi/spi.h>
++
++#define OMAP3BEAGLE_GPIO_ENC28J60_IRQ 157
++
++static struct omap2_mcspi_device_config enc28j60_spi_chip_info = {
++      .turbo_mode     = 0,
++};
++
++static struct spi_board_info omap3beagle_zippy_spi_board_info[] __initdata = {
++      {
++              .modalias               = "enc28j60",
++              .bus_num                = 4,
++              .chip_select    = 0,
++              .max_speed_hz   = 20000000,
++              .controller_data        = &enc28j60_spi_chip_info,
++      },
++};
++
++static void __init omap3beagle_enc28j60_init(void)
++{
++      if ((gpio_request(OMAP3BEAGLE_GPIO_ENC28J60_IRQ, "ENC28J60_IRQ") == 0) &&
++          (gpio_direction_input(OMAP3BEAGLE_GPIO_ENC28J60_IRQ) == 0)) {
++              gpio_export(OMAP3BEAGLE_GPIO_ENC28J60_IRQ, 0);
++              omap3beagle_zippy_spi_board_info[0].irq = gpio_to_irq(OMAP3BEAGLE_GPIO_ENC28J60_IRQ);
++              irq_set_irq_type(omap3beagle_zippy_spi_board_info[0].irq, IRQ_TYPE_EDGE_FALLING);
++      } else {
++              pr_err("Beagle expansionboard: could not obtain gpio for ENC28J60_IRQ\n");
++              return;
++      }
++
++      spi_register_board_info(omap3beagle_zippy_spi_board_info,
++                      ARRAY_SIZE(omap3beagle_zippy_spi_board_info));
++}
++
++#else
++static inline void __init omap3beagle_enc28j60_init(void) { return; }
++#endif
++
+ static struct mtd_partition omap3beagle_nand_partitions[] = {
+       /* All the partition sizes are listed in terms of NAND block size */
+       {
+@@ -271,6 +352,23 @@ static struct omap2_hsmmc_info mmc[] = {
+       {}      /* Terminator */
+ };
++static struct omap2_hsmmc_info mmc_zippy[] = {
++      {
++              .mmc            = 1,
++              .caps           = MMC_CAP_4_BIT_DATA,
++              .gpio_wp        = -EINVAL,
++              .deferred       = true,
++      },
++      {
++              .mmc            = 2,
++              .caps           = MMC_CAP_4_BIT_DATA,
++              .gpio_wp        = OMAP3BEAGLE_GPIO_ZIPPY_MMC_WP,
++              .gpio_cd        = OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD,
++              .transceiver    = true,
++              .deferred       = true,
++      },
++      {}      /* Terminator */
++};
+ static struct regulator_consumer_supply beagle_vmmc1_supply[] = {
+       REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
+ };
+@@ -301,10 +399,21 @@ static int beagle_twl_gpio_setup(struct device *dev,
+ {
+       int r;
+-      mmc[0].gpio_wp = beagle_config.mmc1_gpio_wp;
+-      /* gpio + 0 is "mmc0_cd" (input/IRQ) */
+-      mmc[0].gpio_cd = gpio + 0;
+-      omap_hsmmc_late_init(mmc);
++      switch (expansion_config.mmc_settings) {
++      case EXPANSION_MMC_ZIPPY:
++              mmc_zippy[0].gpio_wp = beagle_config.mmc1_gpio_wp;
++              /* gpio + 0 is "mmc0_cd" (input/IRQ) */
++              mmc_zippy[0].gpio_cd = gpio + 0;
++
++              omap_hsmmc_late_init(mmc_zippy);
++              break;
++      default:
++              mmc[0].gpio_wp = beagle_config.mmc1_gpio_wp;
++              /* gpio + 0 is "mmc0_cd" (input/IRQ) */
++              mmc[0].gpio_cd = gpio + 0;
++
++              omap_hsmmc_late_init(mmc);
++      }
+       /*
+        * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active
+@@ -396,6 +505,14 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
+        },
+ };
++static struct i2c_board_info __initdata zippy_i2c2_rtc[] = {
++#if defined(CONFIG_RTC_DRV_DS1307) || defined(CONFIG_RTC_DRV_DS1307_MODULE)
++      {
++              I2C_BOARD_INFO("ds1307", 0x68),
++      },
++#endif
++};
++
+ static int __init omap3_beagle_i2c_init(void)
+ {
+       omap3_pmic_get_config(&beagle_twldata,
+@@ -406,6 +523,15 @@ static int __init omap3_beagle_i2c_init(void)
+       beagle_twldata.vpll2->constraints.name = "VDVI";
+       omap3_pmic_init("twl4030", &beagle_twldata);
++
++      switch (expansion_config.i2c_settings) {
++      case EXPANSION_I2C_ZIPPY:
++              omap_register_i2c_bus(2, 400, zippy_i2c2_rtc, ARRAY_SIZE(zippy_i2c2_rtc));
++              break;
++      default:
++              omap_register_i2c_bus(2, 400, NULL, 0);
++      }
++
+       /* Bus 3 is attached to the DVI port where devices like the pico DLP
+        * projector don't work reliably with 400kHz */
+       omap_register_i2c_bus(3, 100, beagle_i2c_eeprom, ARRAY_SIZE(beagle_i2c_eeprom));
+@@ -548,10 +674,30 @@ static void __init omap3_beagle_init(void)
+       omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
+       omap3_beagle_init_rev();
++      if (!strcmp(expansionboard_name, "zippy"))
++      {
++              pr_info("Beagle expansionboard: initializing zippy mmc\n");
++              platform_device_register(&omap_zippy_device);
++
++              expansion_config.i2c_settings = EXPANSION_I2C_ZIPPY;
++              expansion_config.mmc_settings = EXPANSION_MMC_ZIPPY;
++
++              omap_mux_init_gpio(OMAP3BEAGLE_GPIO_ZIPPY_MMC_WP, OMAP_PIN_INPUT);
++              omap_mux_init_gpio(OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD, OMAP_PIN_INPUT);
++      }
++
+       if (gpio_is_valid(beagle_config.mmc1_gpio_wp))
+               omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
+-      mmc[0].caps = beagle_config.mmc_caps;
+-      omap_hsmmc_init(mmc);
++
++      switch (expansion_config.mmc_settings) {
++      case EXPANSION_MMC_ZIPPY:
++              mmc_zippy[0].caps = beagle_config.mmc_caps;
++              omap_hsmmc_init(mmc_zippy);
++              break;
++      default:
++              mmc[0].caps = beagle_config.mmc_caps;
++              omap_hsmmc_init(mmc);
++      }
+       omap3_beagle_i2c_init();
+@@ -566,6 +712,12 @@ static void __init omap3_beagle_init(void)
+       omap_sdrc_init(mt46h32m32lf6_sdrc_params,
+                                 mt46h32m32lf6_sdrc_params);
++      if (!strcmp(expansionboard_name, "zippy"))
++      {
++              pr_info("Beagle expansionboard: initializing enc28j60\n");
++              omap3beagle_enc28j60_init();
++      }
++
+       usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
+       usb_musb_init(NULL);
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0003-Beagle-expansion-add-zippy2.patch b/src/patches/kernel/omap/beagle/expansion/0003-Beagle-expansion-add-zippy2.patch
new file mode 100644 (file)
index 0000000..b569f92
--- /dev/null
@@ -0,0 +1,86 @@
+From 45bed17e65e1a83f753896e250f3458654dcb229 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:32:15 -0600
+Subject: [PATCH 03/10] Beagle: expansion: add zippy2
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |   48 ++++++++++++++++++++++++++++++-
+ 1 file changed, 47 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index b3685ed..74da505 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -276,6 +276,46 @@ static void __init omap3beagle_enc28j60_init(void)
+ static inline void __init omap3beagle_enc28j60_init(void) { return; }
+ #endif
++#if IS_ENABLED(CONFIG_KS8851)
++#include <linux/platform_data/spi-omap2-mcspi.h>
++#include <linux/spi/spi.h>
++
++#define OMAP3BEAGLE_GPIO_KS8851_IRQ 157
++
++static struct omap2_mcspi_device_config ks8851_spi_chip_info = {
++      .turbo_mode     = 0,
++};
++
++static struct spi_board_info omap3beagle_zippy2_spi_board_info[] __initdata = {
++      {
++              .modalias               = "ks8851",
++              .bus_num                = 4,
++              .chip_select    = 0,
++              .max_speed_hz   = 36000000,
++              .controller_data        = &ks8851_spi_chip_info,
++      },
++};
++
++static void __init omap3beagle_ks8851_init(void)
++{
++      if ((gpio_request(OMAP3BEAGLE_GPIO_KS8851_IRQ, "KS8851_IRQ") == 0) &&
++          (gpio_direction_input(OMAP3BEAGLE_GPIO_KS8851_IRQ) == 0)) {
++              gpio_export(OMAP3BEAGLE_GPIO_KS8851_IRQ, 0);
++              omap3beagle_zippy2_spi_board_info[0].irq = gpio_to_irq(OMAP3BEAGLE_GPIO_KS8851_IRQ);
++              irq_set_irq_type(omap3beagle_zippy2_spi_board_info[0].irq, IRQ_TYPE_EDGE_FALLING);
++      } else {
++              pr_err("Beagle expansionboard: could not obtain gpio for KS8851_IRQ\n");
++              return;
++      }
++
++      spi_register_board_info(omap3beagle_zippy2_spi_board_info,
++                      ARRAY_SIZE(omap3beagle_zippy2_spi_board_info));
++}
++
++#else
++static inline void __init omap3beagle_ks8851_init(void) { return; }
++#endif
++
+ static struct mtd_partition omap3beagle_nand_partitions[] = {
+       /* All the partition sizes are listed in terms of NAND block size */
+       {
+@@ -674,7 +714,7 @@ static void __init omap3_beagle_init(void)
+       omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
+       omap3_beagle_init_rev();
+-      if (!strcmp(expansionboard_name, "zippy"))
++      if ((!strcmp(expansionboard_name, "zippy")) || (!strcmp(expansionboard_name, "zippy2")))
+       {
+               pr_info("Beagle expansionboard: initializing zippy mmc\n");
+               platform_device_register(&omap_zippy_device);
+@@ -718,6 +758,12 @@ static void __init omap3_beagle_init(void)
+               omap3beagle_enc28j60_init();
+       }
++      if (!strcmp(expansionboard_name, "zippy2"))
++      {
++              pr_info("Beagle expansionboard: initializing ks_8851\n");
++              omap3beagle_ks8851_init();
++      }
++
+       usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
+       usb_musb_init(NULL);
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0004-Beagle-expansion-add-trainer.patch b/src/patches/kernel/omap/beagle/expansion/0004-Beagle-expansion-add-trainer.patch
new file mode 100644 (file)
index 0000000..08ace67
--- /dev/null
@@ -0,0 +1,55 @@
+From 4d9b4e5795e322ed3efed9b8402f604e2e53cc6f Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:33:24 -0600
+Subject: [PATCH 04/10] Beagle: expansion: add trainer
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |   31 +++++++++++++++++++++++++++++++
+ 1 file changed, 31 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 74da505..b5ed547 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -764,6 +764,37 @@ static void __init omap3_beagle_init(void)
+               omap3beagle_ks8851_init();
+       }
++      if (!strcmp(expansionboard_name, "trainer"))
++      {
++              pr_info("Beagle expansionboard: exporting GPIOs 130-141,162 to userspace\n");
++              gpio_request(130, "sysfs");
++              gpio_export(130, 1);
++              gpio_request(131, "sysfs");
++              gpio_export(131, 1);
++              gpio_request(132, "sysfs");
++              gpio_export(132, 1);
++              gpio_request(133, "sysfs");
++              gpio_export(133, 1);
++              gpio_request(134, "sysfs");
++              gpio_export(134, 1);
++              gpio_request(135, "sysfs");
++              gpio_export(135, 1);
++              gpio_request(136, "sysfs");
++              gpio_export(136, 1);
++              gpio_request(137, "sysfs");
++              gpio_export(137, 1);
++              gpio_request(138, "sysfs");
++              gpio_export(138, 1);
++              gpio_request(139, "sysfs");
++              gpio_export(139, 1);
++              gpio_request(140, "sysfs");
++              gpio_export(140, 1);
++              gpio_request(141, "sysfs");
++              gpio_export(141, 1);
++              gpio_request(162, "sysfs");
++              gpio_export(162, 1);
++      }
++
+       usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
+       usb_musb_init(NULL);
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0005-Beagle-expansion-add-CircuitCo-ulcd-Support.patch b/src/patches/kernel/omap/beagle/expansion/0005-Beagle-expansion-add-CircuitCo-ulcd-Support.patch
new file mode 100644 (file)
index 0000000..8b716ee
--- /dev/null
@@ -0,0 +1,285 @@
+From a53e7913a95faefde1ee87a7ea048c04b0850066 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:42:03 -0600
+Subject: [PATCH 05/10] Beagle: expansion: add CircuitCo ulcd Support
+
+This of a cleanup, squashed both ulcd commits into one:
+
+======================================================================
+
+expansion: add ulcd
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+
+======================================================================
+
+beagleboard: fix uLCD7 support
+Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
+
+======================================================================
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c          |  136 ++++++++++++++++++++++
+ drivers/video/omap2/displays/panel-generic-dpi.c |   27 +++++
+ 2 files changed, 163 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 0f9b253..b2807c2 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -118,12 +118,16 @@ static struct {
+       int dvi_pd_gpio;
+       int usr_button_gpio;
+       int mmc_caps;
++      char *lcd_driver_name;
++      int lcd_pwren;
+ } beagle_config = {
+       .mmc1_gpio_wp = -EINVAL,
+       .usb_pwr_level = 0,
+       .dvi_pd_gpio = -EINVAL,
+       .usr_button_gpio = 4,
+       .mmc_caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
++      .lcd_driver_name = "",
++      .lcd_pwren = 156,
+ };
+ static struct gpio omap3_beagle_rev_gpios[] __initdata = {
+@@ -195,6 +199,7 @@ static void __init omap3_beagle_init_rev(void)
+ }
+ char expansionboard_name[16];
++char expansionboard2_name[16];
+ enum {
+       EXPANSION_MMC_NONE = 0,
+@@ -205,6 +210,7 @@ enum {
+ enum {
+       EXPANSION_I2C_NONE = 0,
+       EXPANSION_I2C_ZIPPY,
++      EXPANSION_I2C_7ULCD,
+ };
+ static struct {
+@@ -369,9 +375,53 @@ static struct omap_dss_device beagle_tv_device = {
+       .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
+ };
++static int beagle_enable_lcd(struct omap_dss_device *dssdev)
++{
++      if (gpio_is_valid(beagle_config.lcd_pwren)) {
++              pr_info("%s: Enabling LCD\n", __FUNCTION__);
++              gpio_set_value(beagle_config.lcd_pwren, 0);
++      } else {
++              pr_info("%s: Invalid LCD enable GPIO: %d\n",
++                      __FUNCTION__, beagle_config.lcd_pwren);
++      }
++
++      return 0;
++}
++
++static void beagle_disable_lcd(struct omap_dss_device *dssdev)
++{
++      if (gpio_is_valid(beagle_config.lcd_pwren)) {
++              pr_info("%s: Disabling LCD\n", __FUNCTION__);
++              gpio_set_value(beagle_config.lcd_pwren, 1);
++      } else {
++              pr_info("%s: Invalid LCD enable GPIO: %d\n",
++                      __FUNCTION__, beagle_config.lcd_pwren);
++      }
++
++      return;
++}
++
++static struct panel_generic_dpi_data lcd_panel = {
++      .name = "tfc_s9700rtwv35tr-01b",
++      .platform_enable = beagle_enable_lcd,
++      .platform_disable = beagle_disable_lcd,
++};
++
++static struct omap_dss_device beagle_lcd_device = {
++      .type                   = OMAP_DISPLAY_TYPE_DPI,
++      .name                   = "lcd",
++      .driver_name            = "generic_dpi_panel",
++      .phy.dpi.data_lines     = 24,
++      .platform_enable        = beagle_enable_lcd,
++      .platform_disable       = beagle_disable_lcd,
++      .reset_gpio             = -EINVAL,
++      .data                   = &lcd_panel,
++};
++
+ static struct omap_dss_device *beagle_dss_devices[] = {
+       &beagle_dvi_device,
+       &beagle_tv_device,
++      &beagle_lcd_device,
+ };
+ static struct omap_dss_board_info beagle_dss_data = {
+@@ -553,6 +603,53 @@ static struct i2c_board_info __initdata zippy_i2c2_rtc[] = {
+ #endif
+ };
++#if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007)
++/* Touchscreen */
++#include <linux/i2c/tsc2007.h>
++
++#define OMAP3BEAGLE_TSC2007_GPIO 157
++
++static int omap3beagle_tsc2007_get_pendown_state(void)
++{
++      return !gpio_get_value(OMAP3BEAGLE_TSC2007_GPIO);
++}
++
++static struct tsc2007_platform_data tsc2007_info = {
++      .model = 2007,
++      .x_plate_ohms = 180,
++      .get_pendown_state = omap3beagle_tsc2007_get_pendown_state,
++};
++
++static struct i2c_board_info __initdata beagle_i2c2_bbtoys_ulcd[] = {
++      {
++              I2C_BOARD_INFO("tlc59108", 0x40),
++      },
++      {
++              I2C_BOARD_INFO("tsc2007", 0x48),
++              .platform_data = &tsc2007_info,
++      },
++};
++
++static void __init omap3beagle_tsc2007_init(void)
++{
++      int r;
++
++      omap_mux_init_gpio(OMAP3BEAGLE_TSC2007_GPIO, OMAP_PIN_INPUT_PULLUP);
++
++      r = gpio_request_one(OMAP3BEAGLE_TSC2007_GPIO, GPIOF_IN, "tsc2007_pen_down");
++      if (r < 0) {
++              pr_err("Beagle expansionboard: failed to request GPIO#%d for "
++              "tsc2007 pen down IRQ\n", OMAP3BEAGLE_TSC2007_GPIO);
++              return;
++      }
++
++      beagle_i2c2_bbtoys_ulcd[0].irq = gpio_to_irq(OMAP3BEAGLE_TSC2007_GPIO);
++      irq_set_irq_type(gpio_to_irq(OMAP3BEAGLE_TSC2007_GPIO), IRQ_TYPE_EDGE_FALLING);
++}
++#else
++static struct i2c_board_info __initdata beagle_i2c2_bbtoys_ulcd[] = {};
++#endif
++
+ static int __init omap3_beagle_i2c_init(void)
+ {
+       omap3_pmic_get_config(&beagle_twldata,
+@@ -565,6 +662,10 @@ static int __init omap3_beagle_i2c_init(void)
+       omap3_pmic_init("twl4030", &beagle_twldata);
+       switch (expansion_config.i2c_settings) {
++      case EXPANSION_I2C_7ULCD:
++              omap_register_i2c_bus(2, 400,  beagle_i2c2_bbtoys_ulcd,
++                                                      ARRAY_SIZE(beagle_i2c2_bbtoys_ulcd));
++              break;
+       case EXPANSION_I2C_ZIPPY:
+               omap_register_i2c_bus(2, 400, zippy_i2c2_rtc, ARRAY_SIZE(zippy_i2c2_rtc));
+               break;
+@@ -661,6 +762,18 @@ static int __init expansionboard_setup(char *str)
+       return 0;
+ }
++static int __init expansionboard2_setup(char *str)
++{
++      if (!machine_is_omap3_beagle())
++              return 0;
++
++      if (!str)
++              return -EINVAL;
++      strncpy(expansionboard2_name, str, 16);
++      pr_info("Beagle expansionboard2: %s\n", expansionboard2_name);
++      return 0;
++}
++
+ static int __init beagle_opp_init(void)
+ {
+       int r = 0;
+@@ -726,6 +839,20 @@ static void __init omap3_beagle_init(void)
+               omap_mux_init_gpio(OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD, OMAP_PIN_INPUT);
+       }
++      if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
++      {
++              int r;
++              expansion_config.i2c_settings = EXPANSION_I2C_7ULCD;
++
++              /* TODO: set lcd_driver_name by command line or device tree */
++              beagle_config.lcd_driver_name = "tfc_s9700rtwv35tr-01b",
++              lcd_panel.name = beagle_config.lcd_driver_name;
++
++              r = gpio_request_one(beagle_config.lcd_pwren, GPIOF_OUT_INIT_LOW, "LCD power");
++              if (r < 0)
++                      pr_err("Beagle expansionboard: Unable to get LCD power enable GPIO\n");
++      }
++
+       if (gpio_is_valid(beagle_config.mmc1_gpio_wp))
+               omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
+@@ -795,6 +922,14 @@ static void __init omap3_beagle_init(void)
+               gpio_export(162, 1);
+       }
++      if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
++      {
++      #if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007)
++              pr_info("Beagle expansionboard: initializing touchscreen: tsc2007\n");
++              omap3beagle_tsc2007_init();
++      #endif
++      }
++
+       usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb");
+       usb_musb_init(NULL);
+@@ -816,6 +951,7 @@ static void __init omap3_beagle_init(void)
+ }
+ early_param("buddy", expansionboard_setup);
++early_param("buddy2", expansionboard2_setup);
+ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
+       /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */
+diff --git a/drivers/video/omap2/displays/panel-generic-dpi.c b/drivers/video/omap2/displays/panel-generic-dpi.c
+index 97363f7..614031f 100644
+--- a/drivers/video/omap2/displays/panel-generic-dpi.c
++++ b/drivers/video/omap2/displays/panel-generic-dpi.c
+@@ -515,6 +515,33 @@ static struct panel_config generic_dpi_panels[] = {
+               },
+               .name                   = "primeview_pd104slf",
+       },
++
++      /* ThreeFiveCorp S9700RTWV35TR-01B */
++      {
++              {
++                      .x_res          = 800,
++                      .y_res          = 480,
++
++                      .pixel_clock    = 30000,
++
++                      .hsw            = 49,
++                      .hfp            = 41,
++                      .hbp            = 40,
++
++                      .vsw            = 4,
++                      .vfp            = 14,
++                      .vbp            = 29,
++
++                      .vsync_level    = OMAPDSS_SIG_ACTIVE_LOW,
++                      .hsync_level    = OMAPDSS_SIG_ACTIVE_LOW,
++                      .data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE,
++                      .de_level       = OMAPDSS_SIG_ACTIVE_HIGH,
++                      .sync_pclk_edge = OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES,
++              },
++              .power_on_delay         = 50,
++              .power_off_delay        = 100,
++              .name                   = "tfc_s9700rtwv35tr-01b",
++      },
+ };
+ struct panel_drv_data {
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0006-Beagle-expansion-add-wifi.patch b/src/patches/kernel/omap/beagle/expansion/0006-Beagle-expansion-add-wifi.patch
new file mode 100644 (file)
index 0000000..88d48af
--- /dev/null
@@ -0,0 +1,180 @@
+From f78cd93d767cd75969c4661723cfce46071e5b1b Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:48:52 -0600
+Subject: [PATCH 06/10] Beagle: expansion: add wifi
+
+build fixes from Pantelis Antoniou <panto@antoniou-consulting.com>
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |  119 +++++++++++++++++++++++++++++++
+ 1 file changed, 119 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index a8de97e..2322d6c 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -221,6 +221,73 @@ static struct {
+       .i2c_settings = EXPANSION_I2C_NONE,
+ };
++#if IS_ENABLED(CONFIG_WL12XX)
++#include <linux/regulator/fixed.h>
++#include <linux/ti_wilink_st.h>
++#include <linux/wl12xx.h>
++
++#define OMAP_BEAGLE_WLAN_EN_GPIO    (139)
++#define OMAP_BEAGLE_BT_EN_GPIO      (138)
++#define OMAP_BEAGLE_WLAN_IRQ_GPIO   (137)
++#define OMAP_BEAGLE_FM_EN_BT_WU     (136)
++
++struct wl12xx_platform_data omap_beagle_wlan_data __initdata = {
++      .board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */
++};
++
++static struct ti_st_plat_data wilink_platform_data = {
++      .nshutdown_gpio = OMAP_BEAGLE_BT_EN_GPIO,
++      .dev_name               = "/dev/ttyO1",
++      .flow_cntrl             = 1,
++      .baud_rate              = 3000000,
++      .chip_enable    = NULL,
++      .suspend                = NULL,
++      .resume                 = NULL,
++};
++
++static struct platform_device wl12xx_device = {
++              .name           = "kim",
++              .id                     = -1,
++              .dev.platform_data = &wilink_platform_data,
++};
++
++static struct platform_device btwilink_device = {
++      .name   = "btwilink",
++      .id     = -1,
++};
++#endif
++
++static struct regulator_consumer_supply beagle_vmmc2_supply =
++      REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1");
++
++static struct regulator_init_data beagle_vmmc2 = {
++      .constraints = {
++              .valid_ops_mask = REGULATOR_CHANGE_STATUS,
++      },
++      .num_consumer_supplies = 1,
++      .consumer_supplies = &beagle_vmmc2_supply,
++};
++
++#if IS_ENABLED(CONFIG_WL12XX)
++static struct fixed_voltage_config beagle_vwlan = {
++      .supply_name = "vwl1271",
++      .microvolts = 1800000,  /* 1.8V */
++      .gpio = OMAP_BEAGLE_WLAN_EN_GPIO,
++      .startup_delay = 70000, /* 70ms */
++      .enable_high = 1,
++      .enabled_at_boot = 0,
++      .init_data = &beagle_vmmc2,
++};
++
++static struct platform_device omap_vwlan_device = {
++      .name           = "reg-fixed-voltage",
++      .id             = 1,
++      .dev = {
++              .platform_data = &beagle_vwlan,
++      },
++};
++#endif
++
+ //rcn-ee: this is just a fake regulator, the zippy hardware provides 3.3/1.8 with jumper..
+ static struct fixed_voltage_config beagle_vzippy = {
+       .supply_name = "vzippy",
+@@ -459,6 +526,26 @@ static struct omap2_hsmmc_info mmc_zippy[] = {
+       },
+       {}      /* Terminator */
+ };
++
++static struct omap2_hsmmc_info mmcbbt[] = {
++      {
++              .mmc            = 1,
++              .caps           = MMC_CAP_4_BIT_DATA,
++              .gpio_wp        = -EINVAL,
++              .deferred       = true,
++      },
++      {
++              .name           = "wl1271",
++              .mmc            = 2,
++              .caps           = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,
++              .gpio_wp        = -EINVAL,
++              .gpio_cd        = -EINVAL,
++              .ocr_mask       = MMC_VDD_165_195,
++              .nonremovable   = true,
++      },
++      {}      /* Terminator */
++};
++
+ static struct regulator_consumer_supply beagle_vmmc1_supply[] = {
+       REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
+ };
+@@ -490,6 +577,13 @@ static int beagle_twl_gpio_setup(struct device *dev,
+       int r;
+       switch (expansion_config.mmc_settings) {
++      case EXPANSION_MMC_WIFI:
++              mmcbbt[0].gpio_wp = beagle_config.mmc1_gpio_wp;
++              /* gpio + 0 is "mmc0_cd" (input/IRQ) */
++              mmcbbt[0].gpio_cd = gpio + 0;
++
++              omap_hsmmc_late_init(mmcbbt);
++              break;
+       case EXPANSION_MMC_ZIPPY:
+               mmc_zippy[0].gpio_wp = beagle_config.mmc1_gpio_wp;
+               /* gpio + 0 is "mmc0_cd" (input/IRQ) */
+@@ -839,6 +933,13 @@ static void __init omap3_beagle_init(void)
+               omap_mux_init_gpio(OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD, OMAP_PIN_INPUT);
+       }
++      if (!strcmp(expansionboard_name, "bbtoys-wifi"))
++      {
++      #if IS_ENABLED(CONFIG_WL12XX)
++              expansion_config.mmc_settings = EXPANSION_MMC_WIFI;
++      #endif
++      }
++
+       if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
+       {
+               int r;
+@@ -857,6 +958,10 @@ static void __init omap3_beagle_init(void)
+               omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
+       switch (expansion_config.mmc_settings) {
++      case EXPANSION_MMC_WIFI:
++              mmcbbt[0].caps = beagle_config.mmc_caps;
++              omap_hsmmc_init(mmcbbt);
++              break;
+       case EXPANSION_MMC_ZIPPY:
+               mmc_zippy[0].caps = beagle_config.mmc_caps;
+               omap_hsmmc_init(mmc_zippy);
+@@ -922,6 +1027,20 @@ static void __init omap3_beagle_init(void)
+               gpio_export(162, 1);
+       }
++      if (!strcmp(expansionboard_name, "bbtoys-wifi"))
++      {
++      #if IS_ENABLED(CONFIG_WL12XX)
++              omap_beagle_wlan_data.irq = gpio_to_irq(OMAP_BEAGLE_WLAN_IRQ_GPIO);
++              if (wl12xx_set_platform_data(&omap_beagle_wlan_data))
++                      pr_err("error setting wl12xx data\n");
++              pr_info("Beagle expansionboard: registering wl12xx bt platform device\n");
++              platform_device_register(&wl12xx_device);
++              platform_device_register(&btwilink_device);
++              pr_info("Beagle expansionboard: registering wl12xx wifi platform device\n");
++              platform_device_register(&omap_vwlan_device);
++      #endif
++      }
++
+       if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
+       {
+       #if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007)
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0007-Beagle-expansion-add-beaglefpga.patch b/src/patches/kernel/omap/beagle/expansion/0007-Beagle-expansion-add-beaglefpga.patch
new file mode 100644 (file)
index 0000000..a006c7b
--- /dev/null
@@ -0,0 +1,117 @@
+From 0c361e9db10f9ec3598bf062a605a451857ee06e Mon Sep 17 00:00:00 2001
+From: Bas van der Doorn <bas@doornvd.com>
+Date: Tue, 11 Dec 2012 06:52:22 -0600
+Subject: [PATCH 07/10] Beagle: expansion: add beaglefpga
+
+Added SPI dev and McBSP 3 mux when FPGA is detected
+
+Signed-off-by: Bas van der Doorn <bas@doornvd.com>
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |   76 +++++++++++++++++++++++++++++++
+ 1 file changed, 76 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 2322d6c..c257f3c 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -44,6 +44,7 @@
+ #include <asm/mach/arch.h>
+ #include <asm/mach/map.h>
+ #include <asm/mach/flash.h>
++#include <linux/spi/spi.h>
+ #include <video/omapdss.h>
+ #include <video/omap-panel-data.h>
+@@ -916,6 +917,68 @@ static int __init beagle_opp_init(void)
+ }
+ omap_device_initcall(beagle_opp_init);
++static void __init omap3_beagle_config_mcspi3_mux(void)
++{
++      /* NOTE: Clock pins need to be in input mode */
++      omap_mux_init_signal("sdmmc2_clk.mcspi3_clk", OMAP_PIN_INPUT);
++      omap_mux_init_signal("sdmmc2_cmd.mcspi3_simo", OMAP_PIN_OUTPUT);
++      omap_mux_init_signal("sdmmc2_dat0.mcspi3_somi", OMAP_PIN_INPUT_PULLUP);
++      omap_mux_init_signal("sdmmc2_dat2.mcspi3_cs1", OMAP_PIN_OUTPUT);
++      omap_mux_init_signal("sdmmc2_dat3.mcspi3_cs0", OMAP_PIN_OUTPUT);
++}
++
++static void __init omap3_beagle_config_mcspi4_mux(void)
++{
++      /* NOTE: Clock pins need to be in input mode */
++      omap_mux_init_signal("mcbsp1_clkr.mcspi4_clk", OMAP_PIN_INPUT);
++      omap_mux_init_signal("mcbsp1_dx.mcspi4_simo", OMAP_PIN_OUTPUT);
++      omap_mux_init_signal("mcbsp1_dr.mcspi4_somi", OMAP_PIN_INPUT_PULLUP);
++      omap_mux_init_signal("mcbsp1_fsx.mcspi4_cs0", OMAP_PIN_OUTPUT);
++}
++
++static void __init omap3_beagle_config_mcbsp3_mux(void)
++{
++      omap_mux_init_signal("mcbsp3_fsx.uart2_rx", OMAP_PIN_INPUT);
++      omap_mux_init_signal("uart2_cts.mcbsp3_dx", OMAP_PIN_OUTPUT);
++      omap_mux_init_signal("uart2_rts.mcbsp3_dr", OMAP_PIN_INPUT);
++      /* NOTE: Clock pins need to be in input mode */
++      omap_mux_init_signal("uart2_tx.mcbsp3_clkx", OMAP_PIN_INPUT);
++}
++
++static void __init omap3_beagle_config_fpga_mux(void)
++{
++      omap3_beagle_config_mcbsp3_mux();
++      omap3_beagle_config_mcspi3_mux();
++      omap3_beagle_config_mcspi4_mux();
++}
++
++static struct spi_board_info beagle_mcspi_board_info[] = {
++      /* spi 3.0 */
++      {
++              .modalias       = "spidev",
++              .max_speed_hz   = 48000000, //48 Mbps
++              .bus_num        = 3,
++              .chip_select    = 0,
++              .mode = SPI_MODE_1,
++      },
++      /* spi 3.1 */
++      {
++              .modalias       = "spidev",
++              .max_speed_hz   = 48000000, //48 Mbps
++              .bus_num        = 3,
++              .chip_select    = 1,
++              .mode = SPI_MODE_1,
++      },
++      /* spi 4.0 */
++      {
++              .modalias       = "spidev",
++              .max_speed_hz   = 48000000, //48 Mbps
++              .bus_num        = 4,
++              .chip_select    = 0,
++              .mode = SPI_MODE_1,
++      },
++};
++
+ static void __init omap3_beagle_init(void)
+ {
+       omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
+@@ -1041,6 +1104,19 @@ static void __init omap3_beagle_init(void)
+       #endif
+       }
++      if (!strcmp(expansionboard_name, "beaglefpga"))
++      {
++      #if IS_ENABLED(CONFIG_SPI_SPIDEV)
++              pr_info("Beagle expansionboard: enabling SPIdev for McSPI3/4 and pin muxing for McBSP3 slave mode\n");
++
++              /* FPGA pin settings configure McSPI 3, McSPI 4 and McBSP 3 */
++              omap3_beagle_config_fpga_mux();
++
++              /* register McSPI 3 and McSPI 4 for FPGA programming and control */
++              spi_register_board_info(beagle_mcspi_board_info, ARRAY_SIZE(beagle_mcspi_board_info));
++      #endif
++      }
++
+       if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
+       {
+       #if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007)
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0008-Beagle-expansion-add-spidev.patch b/src/patches/kernel/omap/beagle/expansion/0008-Beagle-expansion-add-spidev.patch
new file mode 100644 (file)
index 0000000..23cc525
--- /dev/null
@@ -0,0 +1,35 @@
+From 5258354e6e4d0b55334099868668a166d967c1d2 Mon Sep 17 00:00:00 2001
+From: Russell Hay <russell.hay@gmail.com>
+Date: Tue, 11 Dec 2012 06:53:58 -0600
+Subject: [PATCH 08/10] Beagle: expansion: add spidev
+
+Signed-off-by: Russell Hay <russell.hay@gmail.com>
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |   10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index c257f3c..3e0313ee 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -1117,6 +1117,16 @@ static void __init omap3_beagle_init(void)
+       #endif
+       }
++      if (!strcmp(expansionboard_name, "spidev"))
++      {
++      #if IS_ENABLED(CONFIG_SPI_SPIDEV)
++              pr_info("Beagle expansionboard: registering spidev\n");
++              omap3_beagle_config_mcspi3_mux();
++              omap3_beagle_config_mcspi4_mux();
++              spi_register_board_info(beagle_mcspi_board_info, ARRAY_SIZE(beagle_mcspi_board_info));
++      #endif
++      }
++
+       if (!strcmp(expansionboard2_name, "bbtoys-ulcd"))
+       {
+       #if IS_ENABLED(CONFIG_TOUCHSCREEN_TSC2007)
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0009-Beagle-expansion-add-Aptina-li5m03-camera.patch b/src/patches/kernel/omap/beagle/expansion/0009-Beagle-expansion-add-Aptina-li5m03-camera.patch
new file mode 100644 (file)
index 0000000..28d2d4a
--- /dev/null
@@ -0,0 +1,217 @@
+From cc6ced0a1cbaea65a507ec3fe543a5b98d760d23 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 06:58:15 -0600
+Subject: [PATCH 09/10] Beagle: expansion: add Aptina li5m03 camera
+
+Based on:
+https://github.com/Aptina/BeagleBoard-xM/blob/master/tools/0266-Adding-MT9P031-Support-files.patch
+
+And on Max Galemin's patch
+https://github.com/MaxGalemin/buildroot/blob/master/board/beagleboard/xm/kernel-patches/linux-0003-Add-support-for-MT9P031-Aptina-image-sensor-driver.patch
+
+And Koen Kooi Previous work's
+https://github.com/beagleboard/kernel/blob/beagleboard-3.2/patches/camera/0003-beagleboard-fix-i2c2-init.patch
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |  142 +++++++++++++++++++++++++++++++
+ 1 file changed, 142 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 3e0313ee..4fb5eae 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -201,6 +201,7 @@ static void __init omap3_beagle_init_rev(void)
+ char expansionboard_name[16];
+ char expansionboard2_name[16];
++char camera_name[16];
+ enum {
+       EXPANSION_MMC_NONE = 0,
+@@ -555,6 +556,14 @@ static struct regulator_consumer_supply beagle_vsim_supply[] = {
+       REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
+ };
++static struct regulator_consumer_supply beagle_vaux3_supply = {
++      .supply         = "cam_1v8",
++};
++
++static struct regulator_consumer_supply beagle_vaux4_supply = {
++      .supply         = "cam_2v8",
++};
++
+ static struct gpio_led gpio_leds[];
+ /* PHY's VCC regulator might be added later, so flag that we need it */
+@@ -677,11 +686,43 @@ static struct regulator_init_data beagle_vsim = {
+       .consumer_supplies      = beagle_vsim_supply,
+ };
++/* VAUX3 for CAM_1V8 */
++static struct regulator_init_data beagle_vaux3 = {
++      .constraints = {
++              .min_uV                 = 1800000,
++              .max_uV                 = 1800000,
++              .apply_uV               = true,
++              .valid_modes_mask       = REGULATOR_MODE_NORMAL
++                                      | REGULATOR_MODE_STANDBY,
++              .valid_ops_mask         = REGULATOR_CHANGE_MODE
++                                      | REGULATOR_CHANGE_STATUS,
++      },
++      .num_consumer_supplies  = 1,
++      .consumer_supplies      = &beagle_vaux3_supply,
++};
++
++/* VAUX4 for CAM_2V8 */
++static struct regulator_init_data beagle_vaux4 = {
++      .constraints = {
++              .min_uV                 = 1800000,
++              .max_uV                 = 1800000,
++              .apply_uV               = true,
++              .valid_modes_mask       = REGULATOR_MODE_NORMAL
++                                      | REGULATOR_MODE_STANDBY,
++              .valid_ops_mask         = REGULATOR_CHANGE_MODE
++                                      | REGULATOR_CHANGE_STATUS,
++      },
++      .num_consumer_supplies  = 1,
++      .consumer_supplies      = &beagle_vaux4_supply,
++};
++
+ static struct twl4030_platform_data beagle_twldata = {
+       /* platform_data for children goes here */
+       .gpio           = &beagle_gpio_data,
+       .vmmc1          = &beagle_vmmc1,
+       .vsim           = &beagle_vsim,
++      .vaux3          = &beagle_vaux3,
++      .vaux4          = &beagle_vaux4,
+ };
+ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
+@@ -745,6 +786,61 @@ static void __init omap3beagle_tsc2007_init(void)
+ static struct i2c_board_info __initdata beagle_i2c2_bbtoys_ulcd[] = {};
+ #endif
++#if IS_ENABLED(CONFIG_VIDEO_MT9P031)
++/* needed for: omap3_beagle_late_initcall */
++#include "devices.h"
++#include <media/omap3isp.h>
++#include <media/mt9p031.h>
++/* needed for: v4l2_dev_to_isp_device */
++#include "../../../drivers/media/platform/omap3isp/isp.h"
++
++#define MT9P031_RESET_GPIO    98
++#define MT9P031_EXT_FREQ      21000000
++#define MT9P031_TARGET_FREQ   48000000
++
++#define MT9P031_I2C_ADDR      0x48
++#define MT9P031_I2C_BUS               2
++
++static struct regulator *reg_1v8, *reg_2v8;
++
++static struct mt9p031_platform_data beagle_mt9p031_platform_data = {
++      .reset          = MT9P031_RESET_GPIO,
++      .ext_freq       = MT9P031_EXT_FREQ,
++      .target_freq    = MT9P031_TARGET_FREQ,
++};
++
++static struct i2c_board_info mt9p031_camera_i2c_device = {
++      I2C_BOARD_INFO("mt9p031", MT9P031_I2C_ADDR),
++      .platform_data = &beagle_mt9p031_platform_data,
++};
++
++static struct isp_subdev_i2c_board_info mt9p031_camera_subdevs[] = {
++      {
++              .board_info = &mt9p031_camera_i2c_device,
++              .i2c_adapter_id = MT9P031_I2C_BUS,
++      },
++      { NULL, 0, },
++};
++
++static struct isp_v4l2_subdevs_group beagle_camera_subdevs[] = {
++      {
++              .subdevs = mt9p031_camera_subdevs,
++              .interface = ISP_INTERFACE_PARALLEL,
++              .bus = {
++                      .parallel = {
++                              .data_lane_shift = 0,
++                              .clk_pol = 1,
++                      }
++              },
++      },
++      { },
++};
++
++static struct isp_platform_data beagle_isp_platform_data = {
++      .subdevs = beagle_camera_subdevs,
++};
++#endif
++
+ static int __init omap3_beagle_i2c_init(void)
+ {
+       omap3_pmic_get_config(&beagle_twldata,
+@@ -869,6 +965,18 @@ static int __init expansionboard2_setup(char *str)
+       return 0;
+ }
++static int __init camera_setup(char *str)
++{
++      if (!machine_is_omap3_beagle())
++              return 0;
++
++      if (!str)
++              return -EINVAL;
++      strncpy(camera_name, str, 16);
++      pr_info("Beagle camera: %s\n", camera_name);
++      return 0;
++}
++
+ static int __init beagle_opp_init(void)
+ {
+       int r = 0;
+@@ -1155,8 +1263,42 @@ static void __init omap3_beagle_init(void)
+       pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
+ }
++static int __init omap3_beagle_late_initcall(void)
++{
++      if (!machine_is_omap3_beagle())
++              return 0;
++
++      if (!cpu_is_omap3630())
++              return 0;
++
++#if IS_ENABLED(CONFIG_VIDEO_MT9P031)
++      if ((!strcmp(camera_name, "lbcm5m1")) || (!strcmp(camera_name, "li5m03")))
++      {
++              pr_info("Beagle camera: MT9P031 init\n");
++
++              reg_1v8 = regulator_get(NULL, "cam_1v8");
++              if (IS_ERR(reg_1v8))
++                      pr_err("%s: cannot get cam_1v8 regulator\n", __func__);
++              else
++                      regulator_enable(reg_1v8);
++
++              reg_2v8 = regulator_get(NULL, "cam_2v8");
++              if (IS_ERR(reg_2v8))
++                      pr_err("%s: cannot get cam_2v8 regulator\n", __func__);
++              else
++                      regulator_enable(reg_2v8);
++
++              omap3_init_camera(&beagle_isp_platform_data);
++      }
++#endif
++      return 0;
++}
++
+ early_param("buddy", expansionboard_setup);
+ early_param("buddy2", expansionboard2_setup);
++early_param("camera", camera_setup);
++
++late_initcall(omap3_beagle_late_initcall);
+ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
+       /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0010-Beagle-expansion-add-LSR-COM6L-Adapter-Board.patch b/src/patches/kernel/omap/beagle/expansion/0010-Beagle-expansion-add-LSR-COM6L-Adapter-Board.patch
new file mode 100644 (file)
index 0000000..04a3656
--- /dev/null
@@ -0,0 +1,123 @@
+From f2e2294733d926e627dcda6425f58611b185c7fc Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 11 Dec 2012 07:02:40 -0600
+Subject: [PATCH 10/10] Beagle: expansion: add LSR COM6L Adapter Board
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |   60 ++++++++++++++++++++++++++++---
+ 1 file changed, 55 insertions(+), 5 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 0ac1b49..5a7e7b5 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -202,6 +202,7 @@ static void __init omap3_beagle_init_rev(void)
+ char expansionboard_name[16];
+ char expansionboard2_name[16];
+ char camera_name[16];
++char wl12xx_name[16];
+ enum {
+       EXPANSION_MMC_NONE = 0,
+@@ -237,6 +238,10 @@ struct wl12xx_platform_data omap_beagle_wlan_data __initdata = {
+       .board_ref_clock = WL12XX_REFCLOCK_38, /* 38.4 MHz */
+ };
++struct wl12xx_platform_data omap_beagle_wlan_data_26mhz __initdata = {
++      .board_ref_clock = WL12XX_REFCLOCK_26, /* 26 MHz */
++};
++
+ static struct ti_st_plat_data wilink_platform_data = {
+       .nshutdown_gpio = OMAP_BEAGLE_BT_EN_GPIO,
+       .dev_name               = "/dev/ttyO1",
+@@ -987,6 +992,18 @@ static int __init camera_setup(char *str)
+       return 0;
+ }
++static int __init wl12xx_setup(char *str)
++{
++      if (!machine_is_omap3_beagle())
++              return 0;
++
++      if (!str)
++              return -EINVAL;
++      strncpy(wl12xx_name, str, 16);
++      pr_info("Beagle wl12xx clk: %s\n", wl12xx_name);
++      return 0;
++}
++
+ static int __init beagle_opp_init(void)
+ {
+       int r = 0;
+@@ -1114,9 +1131,29 @@ static void __init omap3_beagle_init(void)
+               omap_mux_init_gpio(OMAP3BEAGLE_GPIO_ZIPPY_MMC_CD, OMAP_PIN_INPUT);
+       }
+-      if (!strcmp(expansionboard_name, "bbtoys-wifi"))
++      if ((!strcmp(expansionboard_name, "bbtoys-wifi")) || (!strcmp(expansionboard_name, "lsr-com6l-adpt")))
+       {
+       #if IS_ENABLED(CONFIG_WL12XX)
++              pr_info("Beagle expansion: wl12xx: setting up gpio pinmux\n");
++
++              omap_mux_init_gpio(OMAP_BEAGLE_FM_EN_BT_WU, OMAP_PIN_OUTPUT);
++              omap_mux_init_gpio(OMAP_BEAGLE_BT_EN_GPIO, OMAP_PIN_OUTPUT);
++              omap_mux_init_gpio(OMAP_BEAGLE_WLAN_EN_GPIO, OMAP_PIN_OUTPUT);
++
++              omap_mux_init_gpio(OMAP_BEAGLE_WLAN_IRQ_GPIO, OMAP_PIN_INPUT_PULLUP);
++
++              /* WLAN SDIO: MMC2 CLK */
++              omap_mux_init_signal("sdmmc2_clk.sdmmc2_clk", OMAP_PIN_INPUT_PULLUP);
++
++              /* WLAN SDIO: MMC2 CMD */
++              omap_mux_init_signal("sdmmc2_cmd.sdmmc2_cmd", OMAP_PIN_INPUT_PULLUP);
++
++              /* WLAN SDIO: MMC2 DAT[0-3] */
++              omap_mux_init_signal("sdmmc2_dat0.sdmmc2_dat0", OMAP_PIN_INPUT_PULLUP);
++              omap_mux_init_signal("sdmmc2_dat1.sdmmc2_dat1", OMAP_PIN_INPUT_PULLUP);
++              omap_mux_init_signal("sdmmc2_dat2.sdmmc2_dat2", OMAP_PIN_INPUT_PULLUP);
++              omap_mux_init_signal("sdmmc2_dat3.sdmmc2_dat3", OMAP_PIN_INPUT_PULLUP);
++
+               expansion_config.mmc_settings = EXPANSION_MMC_WIFI;
+       #endif
+       }
+@@ -1208,12 +1245,24 @@ static void __init omap3_beagle_init(void)
+               gpio_export(162, 1);
+       }
+-      if (!strcmp(expansionboard_name, "bbtoys-wifi"))
++      if ((!strcmp(expansionboard_name, "bbtoys-wifi")) || (!strcmp(expansionboard_name, "lsr-com6l-adpt")))
+       {
+       #if IS_ENABLED(CONFIG_WL12XX)
+-              omap_beagle_wlan_data.irq = gpio_to_irq(OMAP_BEAGLE_WLAN_IRQ_GPIO);
+-              if (wl12xx_set_platform_data(&omap_beagle_wlan_data))
+-                      pr_err("error setting wl12xx data\n");
++              pr_info("Beagle expansionboard: initializing wl12xx platform\n");
++
++              if (!strcmp(wl12xx_name, "wl12xx_26mhz")) {
++                      pr_info("wl12xx: 26Mhz reference clock (TiWi5)\n");
++                      omap_beagle_wlan_data_26mhz.irq = gpio_to_irq(OMAP_BEAGLE_WLAN_IRQ_GPIO);
++                      if (wl12xx_set_platform_data(&omap_beagle_wlan_data_26mhz))
++                              pr_err("error setting wl12xx data\n");
++              } else {
++                      pr_info("wl12xx: 38.4Mhz reference clock (TiWi2/TiWi-BLE)\n");
++                      pr_info("wl12xx: for (TiWi5) support pass kernel [wl12xx_clk=wl12xx_26mhz]\n");
++                      omap_beagle_wlan_data.irq = gpio_to_irq(OMAP_BEAGLE_WLAN_IRQ_GPIO);
++                      if (wl12xx_set_platform_data(&omap_beagle_wlan_data))
++                              pr_err("error setting wl12xx data\n");
++              }
++
+               pr_info("Beagle expansionboard: registering wl12xx bt platform device\n");
+               platform_device_register(&wl12xx_device);
+               platform_device_register(&btwilink_device);
+@@ -1307,6 +1356,7 @@ static int __init omap3_beagle_late_initcall(void)
+ early_param("buddy", expansionboard_setup);
+ early_param("buddy2", expansionboard2_setup);
+ early_param("camera", camera_setup);
++early_param("wl12xx_clk", wl12xx_setup);
+ late_initcall(omap3_beagle_late_initcall);
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0011-Beagle-expansion-LSR-COM6L-Adapter-Board-also-initia.patch b/src/patches/kernel/omap/beagle/expansion/0011-Beagle-expansion-LSR-COM6L-Adapter-Board-also-initia.patch
new file mode 100644 (file)
index 0000000..a8edc77
--- /dev/null
@@ -0,0 +1,73 @@
+From 89eb49ac0268518799984fa035ac3fea0ae758ec Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Mon, 21 Jan 2013 11:52:20 -0600
+Subject: [PATCH 11/11] Beagle: expansion: LSR COM6L Adapter Board also
+ initialize the 24c256 eeprom
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |   20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 5a7e7b5..6797488 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -39,6 +39,7 @@
+ #include <linux/regulator/machine.h>
+ #include <linux/regulator/fixed.h>
+ #include <linux/i2c/twl.h>
++#include <linux/i2c/at24.h>
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+@@ -214,6 +215,7 @@ enum {
+       EXPANSION_I2C_NONE = 0,
+       EXPANSION_I2C_ZIPPY,
+       EXPANSION_I2C_7ULCD,
++      EXPANSION_I2C_COM6L,
+ };
+ static struct {
+@@ -856,6 +858,20 @@ static struct isp_platform_data beagle_isp_platform_data = {
+ };
+ #endif
++static struct at24_platform_data beagle_at24_eeprom_info = {
++      .byte_len       = (256*1024) / 8,
++      .page_size      = 64,
++      .flags          = AT24_FLAG_ADDR16,
++      .context        = (void *)NULL,
++};
++
++static struct i2c_board_info __initdata com6l_adpt_eeprom[] = {
++      {
++              I2C_BOARD_INFO("24c256", 0x50),
++              .platform_data  = &beagle_at24_eeprom_info,
++      },
++};
++
+ static int __init omap3_beagle_i2c_init(void)
+ {
+       omap3_pmic_get_config(&beagle_twldata,
+@@ -875,6 +891,9 @@ static int __init omap3_beagle_i2c_init(void)
+       case EXPANSION_I2C_ZIPPY:
+               omap_register_i2c_bus(2, 400, zippy_i2c2_rtc, ARRAY_SIZE(zippy_i2c2_rtc));
+               break;
++      case EXPANSION_I2C_COM6L:
++              omap_register_i2c_bus(2, 400, com6l_adpt_eeprom, ARRAY_SIZE(com6l_adpt_eeprom));
++              break;
+       default:
+               omap_register_i2c_bus(2, 400, NULL, 0);
+       }
+@@ -1155,6 +1174,7 @@ static void __init omap3_beagle_init(void)
+               omap_mux_init_signal("sdmmc2_dat3.sdmmc2_dat3", OMAP_PIN_INPUT_PULLUP);
+               expansion_config.mmc_settings = EXPANSION_MMC_WIFI;
++              expansion_config.i2c_settings = EXPANSION_I2C_COM6L;
+       #endif
+       }
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/beagle/expansion/0011-WIP-Beagle-expansion-extend-spidev-to-uart2.patch b/src/patches/kernel/omap/beagle/expansion/0011-WIP-Beagle-expansion-extend-spidev-to-uart2.patch
new file mode 100644 (file)
index 0000000..2039e4a
--- /dev/null
@@ -0,0 +1,43 @@
+From d78f1a01cc52ebad5d59edad772f2b403bfe67bd Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Wed, 12 Dec 2012 11:34:29 -0600
+Subject: [PATCH 11/11] WIP: Beagle: expansion: extend spidev to uart2
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle.c |   12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index 4fa880a..e4cfd5f 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -1162,6 +1162,16 @@ static void __init omap3_beagle_init(void)
+       if (gpio_is_valid(beagle_config.dvi_pd_gpio))
+               omap_mux_init_gpio(beagle_config.dvi_pd_gpio, OMAP_PIN_OUTPUT);
+       omap_display_init(&beagle_dss_data);
++
++      if (!strcmp(expansionboard_name, "spidev"))
++      {
++              pr_info("Beagle expansion: spidev: enable uart2/ttyO1\n");
++              omap_mux_init_signal("uart2_tx.uart2_tx", OMAP_PIN_OUTPUT);
++              omap_mux_init_signal("uart2_rts.uart2_rts", OMAP_PIN_OUTPUT);
++              omap_mux_init_signal("uart2_cts.uart2_cts", OMAP_PIN_INPUT);
++              omap_mux_init_signal("mcbsp3_fsx.uart2_rx", OMAP_PIN_INPUT);
++      }
++
+       omap_serial_init();
+       omap_sdrc_init(mt46h32m32lf6_sdrc_params,
+                                 mt46h32m32lf6_sdrc_params);
+@@ -1248,7 +1258,7 @@ static void __init omap3_beagle_init(void)
+       if (!strcmp(expansionboard_name, "spidev"))
+       {
+-              pr_info("Beagle expansionboard: registering spidev\n");
++              pr_info("Beagle expansionboard: spidev: enabling spi3/spi4\n");
+               omap3_beagle_config_mcspi3_mux();
+               omap3_beagle_config_mcspi4_mux();
+               spi_register_board_info(beagle_mcspi_board_info, ARRAY_SIZE(beagle_mcspi_board_info));
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/panda/0001-panda-fix-wl12xx-regulator.patch b/src/patches/kernel/omap/panda/0001-panda-fix-wl12xx-regulator.patch
new file mode 100644 (file)
index 0000000..de0e84b
--- /dev/null
@@ -0,0 +1,27 @@
+From a3abd1593e381deb4b1f358a55069988996eeae4 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Tue, 2 Aug 2011 21:55:34 -0500
+Subject: [PATCH 1/2] panda: fix wl12xx regulator
+
+pulled from: http://elinux.org/Panda_How_to_kernel_3_0_rel
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/twl-common.c |    1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c
+index e49b40b..0fd1a70 100644
+--- a/arch/arm/mach-omap2/twl-common.c
++++ b/arch/arm/mach-omap2/twl-common.c
+@@ -360,6 +360,7 @@ static struct regulator_init_data omap4_vusb_idata = {
+ static struct regulator_init_data omap4_clk32kg_idata = {
+       .constraints = {
+               .valid_ops_mask         = REGULATOR_CHANGE_STATUS,
++              .always_on              = true,
+       },
+ };
+-- 
+1.7.7.6
+
diff --git a/src/patches/kernel/omap/panda/0002-ti-st-st-kim-fixing-firmware-path.patch b/src/patches/kernel/omap/panda/0002-ti-st-st-kim-fixing-firmware-path.patch
new file mode 100644 (file)
index 0000000..694bc36
--- /dev/null
@@ -0,0 +1,36 @@
+From 8de5d11f076ee25182df805ab78e0823ce4dd2be Mon Sep 17 00:00:00 2001
+From: Ricardo Salveti de Araujo <ricardo.salveti@linaro.org>
+Date: Tue, 25 Oct 2011 10:06:39 +0200
+Subject: [PATCH 2/2] ti-st/st-kim: fixing firmware path
+
+Signed-off-by: Ricardo Salveti de Araujo <ricardo.salveti@linaro.org>
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/misc/ti-st/st_kim.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/misc/ti-st/st_kim.c b/drivers/misc/ti-st/st_kim.c
+index 9ff942a..f673464 100644
+--- a/drivers/misc/ti-st/st_kim.c
++++ b/drivers/misc/ti-st/st_kim.c
+@@ -244,7 +244,7 @@ static long read_local_version(struct kim_data_s *kim_gdata, char *bts_scr_name)
+       if (version & 0x8000)
+               maj_ver |= 0x0008;
+-      sprintf(bts_scr_name, "TIInit_%d.%d.%d.bts", chip, maj_ver, min_ver);
++      sprintf(bts_scr_name, "ti-connectivity/TIInit_%d.%d.%d.bts", chip, maj_ver, min_ver);
+       /* to be accessed later via sysfs entry */
+       kim_gdata->version.full = version;
+@@ -287,7 +287,7 @@ static long download_firmware(struct kim_data_s *kim_gdata)
+       long len = 0;
+       unsigned char *ptr = NULL;
+       unsigned char *action_ptr = NULL;
+-      unsigned char bts_scr_name[30] = { 0 }; /* 30 char long bts scr name? */
++      unsigned char bts_scr_name[50] = { 0 }; /* 50 char long bts scr name? */
+       int wr_room_space;
+       int cmd_size;
+       unsigned long timeout;
+-- 
+1.7.7.6
+
diff --git a/src/patches/kernel/omap/panda/0003-Panda-expansion-add-spidev.patch b/src/patches/kernel/omap/panda/0003-Panda-expansion-add-spidev.patch
new file mode 100644 (file)
index 0000000..9369852
--- /dev/null
@@ -0,0 +1,112 @@
+From 3304f2feba4999fc1013911f0cf0d9acc33a0117 Mon Sep 17 00:00:00 2001
+From: Adrien Ferre <ferre.adrien@gmail.com>
+Date: Mon, 25 Mar 2013 12:00:38 -0500
+Subject: [PATCH 3/3] Panda: expansion: add spidev
+
+I've made a patch to enable spidev on pandaboards using buddy=spidev just like for beagle.
+
+https://github.com/RobertCNelson/stable-kernel/issues/22
+
+Signed-off-by: Adrien Ferre <ferre.adrien@gmail.com>
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap4panda.c |   43 ++++++++++++++++++++++++++++++++
+ 1 file changed, 43 insertions(+)
+
+diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
+index 1e2c75e..3563f86 100644
+--- a/arch/arm/mach-omap2/board-omap4panda.c
++++ b/arch/arm/mach-omap2/board-omap4panda.c
+@@ -22,6 +22,7 @@
+ #include <linux/clk.h>
+ #include <linux/io.h>
+ #include <linux/leds.h>
++#include <linux/irq.h>
+ #include <linux/gpio.h>
+ #include <linux/usb/otg.h>
+ #include <linux/i2c/twl.h>
+@@ -35,6 +36,7 @@
+ #include <linux/wl12xx.h>
+ #include <linux/irqchip/arm-gic.h>
+ #include <linux/platform_data/omap-abe-twl6040.h>
++#include <linux/spi/spi.h>
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+@@ -54,6 +56,8 @@
+ #define GPIO_WIFI_PMENA               43
+ #define GPIO_WIFI_IRQ         53
++char expboard_name[16];
++
+ /* wl127x BT, FM, GPS connectivity chip */
+ static struct ti_st_plat_data wilink_platform_data = {
+       .nshutdown_gpio = 46,
+@@ -99,6 +103,25 @@ static struct platform_device leds_gpio = {
+       },
+ };
++static struct spi_board_info panda_mcspi_board_info[] = {
++      /* spi 1.0 */
++      {
++              .modalias       = "spidev",
++              .max_speed_hz   = 48000000, //48 Mbps
++              .bus_num        = 1,
++              .chip_select    = 0,
++              .mode = SPI_MODE_1,
++      },
++      /* spi 1.1 */
++      {
++              .modalias       = "spidev",
++              .max_speed_hz   = 48000000, //48 Mbps
++              .bus_num        = 1,
++              .chip_select    = 1,
++              .mode = SPI_MODE_1,
++      },
++};
++
+ static struct omap_abe_twl6040_data panda_abe_audio_data = {
+       /* Audio out */
+       .has_hs         = ABE_TWL6040_LEFT | ABE_TWL6040_RIGHT,
+@@ -161,6 +184,18 @@ static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
+       .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
+ };
++static int __init expansionboard_setup(char *str)
++{
++      if (!machine_is_omap4_panda())
++              return 0;
++
++      if (!str)
++              return -EINVAL;
++      strncpy(expboard_name, str, 16);
++      pr_info("Panda expansionboard: %s\n", expboard_name);
++      return 0;
++}
++
+ static void __init omap4_ehci_init(void)
+ {
+       int ret;
+@@ -435,11 +470,19 @@ static void __init omap4_panda_init(void)
+       omap_sdrc_init(NULL, NULL);
+       omap4_twl6030_hsmmc_init(mmc);
+       omap4_ehci_init();
++      if (!strcmp(expboard_name, "spidev")) {
++      #if IS_ENABLED(CONFIG_SPI_SPIDEV)
++              pr_info("Panda expansionboard: spidev: enabling spi3/spi4\n");
++              spi_register_board_info(panda_mcspi_board_info, ARRAY_SIZE(panda_mcspi_board_info));
++      #endif
++      }
+       usb_bind_phy("musb-hdrc.2.auto", 0, "omap-usb2.3.auto");
+       usb_musb_init(&musb_board_data);
+       omap4_panda_display_init();
+ }
++early_param("buddy", expansionboard_setup);
++
+ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")
+       /* Maintainer: David Anders - Texas Instruments Inc */
+       .atag_offset    = 0x100,
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/panda/0004-HACK-PandaES-disable-cpufreq-so-board-will-boot.patch b/src/patches/kernel/omap/panda/0004-HACK-PandaES-disable-cpufreq-so-board-will-boot.patch
new file mode 100644 (file)
index 0000000..12194e4
--- /dev/null
@@ -0,0 +1,38 @@
+From 359104632fa556e3c5c78e4016c2585896225716 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Mon, 1 Apr 2013 12:17:50 -0500
+Subject: [PATCH 4/4] HACK: PandaES: disable cpufreq so board will boot
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/cpufreq/omap-cpufreq.c |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/cpufreq/omap-cpufreq.c b/drivers/cpufreq/omap-cpufreq.c
+index 0279d18..0a8ac09 100644
+--- a/drivers/cpufreq/omap-cpufreq.c
++++ b/drivers/cpufreq/omap-cpufreq.c
+@@ -31,6 +31,8 @@
+ #include <asm/smp_plat.h>
+ #include <asm/cpu.h>
++#include "../../arch/arm/mach-omap2/soc.h"
++
+ /* OPP tolerance in percentage */
+ #define       OPP_TOLERANCE   4
+@@ -246,6 +248,11 @@ static struct cpufreq_driver omap_driver = {
+ static int omap_cpufreq_probe(struct platform_device *pdev)
+ {
++      if (cpu_is_omap446x()) {
++              pr_err("%s: unsupported Silicon?\n", __func__);
++              return -EINVAL;
++      }
++
+       mpu_dev = get_cpu_device(0);
+       if (!mpu_dev) {
+               pr_warning("%s: unable to get the mpu device\n", __func__);
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/panda/0006-ARM-hw_breakpoint-Enable-debug-powerdown-only-if-sys.patch b/src/patches/kernel/omap/panda/0006-ARM-hw_breakpoint-Enable-debug-powerdown-only-if-sys.patch
new file mode 100644 (file)
index 0000000..fa64934
--- /dev/null
@@ -0,0 +1,122 @@
+From 76c1d8cdfa0967b04ca8168a77bb101d4ea71150 Mon Sep 17 00:00:00 2001
+From: Santosh Shilimkar <santosh.shilimkar@ti.com>
+Date: Mon, 18 Mar 2013 06:51:30 +0000
+Subject: [PATCH 6/6] ARM: hw_breakpoint: Enable debug powerdown only if
+ system supports 'has_ossr'
+
+On Friday 15 March 2013 10:30 AM, Will Deacon wrote:
+> On Thu, Mar 14, 2013 at 01:08:00PM +0530, Santosh Shilimkar wrote:
+>> Will,
+>
+> Hi guys,
+>
+> I'm out of the office at the moment and have really terrible connectivity,
+> so I can't do too much until next week. However, I don't think adding the
+> has_ossr check is the right fix for this problem.
+>
+>> On Wednesday 13 March 2013 05:59 PM, Lokesh Vutla wrote:
+>>> Hi Dietmar,
+>>> On Wednesday 13 March 2013 05:35 PM, Dietmar Eggemann wrote:
+>>>> On 13/03/13 06:52, Lokesh Vutla wrote:
+>>>>> Commit {9a6eb31 ARM: hw_breakpoint: Debug powerdown support for
+>>>>> self-hosted
+>>>>> debug} introduces debug powerdown support for self-hosted debug.
+>>>>> While merging the patch 'has_ossr' check was removed which
+>>>>> was needed for hardwares which doesn't support self-hosted debug.
+>>>>> Pandaboard (A9) is one such hardware and Dietmar's orginial
+>>>>> patch did mention this issue.
+>>>>> Without that check on Panda with CPUIDLE enabled, a flood of
+>>>>> below messages thrown.
+>>>>>
+>>>>> [ 3.597930] hw-breakpoint: CPU 0 failed to disable vector catch
+>>>>> [ 3.597991] hw-breakpoint: CPU 1 failed to disable vector catch
+>
+> Ok, so this means that we've taken an undefined instruction exception while
+> trying to reset the debug registers on the PM_EXIT path. Now, the code there
+> deals with CPUs that don't have the save/restore registers just fine, so
+> that shouldn't have anything to do with this problem, particularly if the
+> bit that is tripping us up is related to clearing vector catch.
+>
+Agree.
+
+> Furthermore, I was under the impression that hw_breakpoint did actually
+> work on panda, which implies that a cold boot *does* manage to reset the
+> registers (can you please confirm this by looking in your dmesg during
+> boot?). In that case, it seems as though a PM cycle is powering down a
+> bunch of debug logic that was powered up during boot, and then we trip over
+> because we can't access the register bank.
+>
+Actually it seems to be without PM. Thanks to analysis from Lokesh, the issue
+can be seen even with just suspend or cpu hotplug. So cold boot as such is
+fine.
+
+> The proper solution to this problem requires us to establish exactly what is
+> turning off the debug registers, and then having an OMAP PM notifier to
+> enable it again. Assuming this has always been the case, I expect hardware
+> debug across PM fails silently with older kernels.
+>
+This has been always the case it seems with CPU power cycle.
+After the CPU is power cycled, 'DBGAUTHSTATUS' reads '0xaa' rather
+than '0xaf' which means 'DBGEN = 0' and hence code fails to enable
+monitor mode. This happens on both secure and GP devices and it can not
+be patched since the secure code is ROM'ed. We didn't notice so far
+because hw_breakpoint support was not default enabled on OMAP till the
+multi-platform build.
+
+>> I was also wondering whether we should just warn once rather
+>> than continuous warnings in the notifier. Patch is end of the
+>> email.
+>
+> Could do, but I'd like to see a fix for the real issue before we simply hide
+> the warnings :)
+>
+Agree here too. As evident above, the feature won't work on OMAP4
+devices with PM and hence some solution is needed.
+
+What you think of below ?
+
+>From d74b4264f6a5967b0f7ada96aad77ab0ac30dbed Mon Sep 17 00:00:00 2001
+From: Santosh Shilimkar <santosh.shilimkar@ti.com>
+Date: Mon, 18 Mar 2013 11:59:04 +0530
+Subject: [PATCH] ARM: hw_breakpoints: Check for CPU debug availability before
+ enabling it
+
+CPU debug features like hardware break, watchpoints can be used only when
+the debug mode is enabled and available for non-secure mode.
+
+Hence check 'DBGAUTHSTATUS.DBGEN' before proceeding to enable the
+features.
+
+Thanks to Will for pointers and Lokesh for the analysis of the issue on
+OMAP4 where after a CPU power cycle, debug mode gets disabled.
+
+Cc: Will Deacon <Will.Deacon@arm.com>
+
+Tested-by: Lokesh Vutla <lokeshvutla@ti.com>
+Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
+---
+ arch/arm/kernel/hw_breakpoint.c |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c
+index 96093b7..683a7cf 100644
+--- a/arch/arm/kernel/hw_breakpoint.c
++++ b/arch/arm/kernel/hw_breakpoint.c
+@@ -930,6 +930,14 @@ static void reset_ctrl_regs(void *unused)
+       int i, raw_num_brps, err = 0, cpu = smp_processor_id();
+       u32 val;
++      /* Check if we have access to CPU debug features */
++      ARM_DBG_READ(c7, c14, 6, val);
++      if ((val & 0x1) == 0) {
++              pr_warn_once("CPU %d debug is unavailable\n", cpu);
++              cpumask_or(&debug_err_mask, &debug_err_mask, cpumask_of(cpu));
++              return;
++      }
++
+       /*
+        * v7 debug contains save and restore registers so that debug state
+        * can be maintained across low-power modes without leaving the debug
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/panda/0007-Revert-regulator-twl-Remove-TWL6030_FIXED_RESOURCE.patch b/src/patches/kernel/omap/panda/0007-Revert-regulator-twl-Remove-TWL6030_FIXED_RESOURCE.patch
new file mode 100644 (file)
index 0000000..0799d83
--- /dev/null
@@ -0,0 +1,39 @@
+From 42d8b74383b670412107c943efd2fec46aa04158 Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Sat, 1 Jun 2013 16:32:46 -0500
+Subject: [PATCH 07/10] Revert "regulator: twl: Remove TWL6030_FIXED_RESOURCE"
+
+This reverts commit d1924519fe1dada0cfd9a228bf2ff1ea15840c84.
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/regulator/twl-regulator.c |   13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c
+index fb6e67d..7ce7edf 100644
+--- a/drivers/regulator/twl-regulator.c
++++ b/drivers/regulator/twl-regulator.c
+@@ -933,6 +933,19 @@ static const struct twlreg_info TWLFIXED_INFO_##label = { \
+               }, \
+       }
++#define TWL6030_FIXED_RESOURCE(label, offset, turnon_delay) \
++static struct twlreg_info TWLRES_INFO_##label = { \
++      .base = offset, \
++      .desc = { \
++              .name = #label, \
++              .id = TWL6030_REG_##label, \
++              .ops = &twl6030_fixed_resource, \
++              .type = REGULATOR_VOLTAGE, \
++              .owner = THIS_MODULE, \
++              .enable_time = turnon_delay, \
++              }, \
++      }
++
+ #define TWL6025_ADJUSTABLE_SMPS(label, offset) \
+ static const struct twlreg_info TWLSMPS_INFO_##label = { \
+       .base = offset, \
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/panda/0008-Revert-regulator-twl-Remove-another-unused-variable-.patch b/src/patches/kernel/omap/panda/0008-Revert-regulator-twl-Remove-another-unused-variable-.patch
new file mode 100644 (file)
index 0000000..4abbd05
--- /dev/null
@@ -0,0 +1,34 @@
+From 48e4598f1b8e9dd486d551b76c5f5021d0dc946d Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Sat, 1 Jun 2013 16:32:48 -0500
+Subject: [PATCH 08/10] Revert "regulator: twl: Remove another unused variable
+ warning"
+
+This reverts commit 029dd3cefa46ecdd879f9b4e2df3bdf4371cc22c.
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/regulator/twl-regulator.c |    7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c
+index 7ce7edf..124a2f2 100644
+--- a/drivers/regulator/twl-regulator.c
++++ b/drivers/regulator/twl-regulator.c
+@@ -633,6 +633,13 @@ static struct regulator_ops twl6030fixed_ops = {
+       .get_status     = twl6030reg_get_status,
+ };
++static struct regulator_ops twl6030_fixed_resource = {
++      .enable         = twl6030reg_enable,
++      .disable        = twl6030reg_disable,
++      .is_enabled     = twl6030reg_is_enabled,
++      .get_status     = twl6030reg_get_status,
++};
++
+ /*
+  * SMPS status and control
+  */
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/panda/0009-Revert-regulator-twl-Remove-references-to-the-twl403.patch b/src/patches/kernel/omap/panda/0009-Revert-regulator-twl-Remove-references-to-the-twl403.patch
new file mode 100644 (file)
index 0000000..27bc6ea
--- /dev/null
@@ -0,0 +1,28 @@
+From 76cc643690032d9789bbd17c9a3542cae4b0603e Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Sat, 1 Jun 2013 16:32:51 -0500
+Subject: [PATCH 09/10] Revert "regulator: twl: Remove references to the
+ twl4030 regulator"
+
+This reverts commit e76ab829cc2d8b6350a3f01fffb208df4d7d8c1b.
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/regulator/twl-regulator.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c
+index 124a2f2..5a18317 100644
+--- a/drivers/regulator/twl-regulator.c
++++ b/drivers/regulator/twl-regulator.c
+@@ -1021,6 +1021,7 @@ TWL6030_FIXED_LDO(VDAC, 0x64, 1800, 0);
+ TWL6030_FIXED_LDO(VUSB, 0x70, 3300, 0);
+ TWL6030_FIXED_LDO(V1V8, 0x16, 1800, 0);
+ TWL6030_FIXED_LDO(V2V1, 0x1c, 2100, 0);
++TWL6030_FIXED_RESOURCE(CLK32KG, 0x8C, 0);
+ TWL6025_ADJUSTABLE_SMPS(SMPS3, 0x34);
+ TWL6025_ADJUSTABLE_SMPS(SMPS4, 0x10);
+ TWL6025_ADJUSTABLE_SMPS(VIO, 0x16);
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/panda/0010-Revert-regulator-twl-Remove-references-to-32kHz-cloc.patch b/src/patches/kernel/omap/panda/0010-Revert-regulator-twl-Remove-references-to-32kHz-cloc.patch
new file mode 100644 (file)
index 0000000..ad18b29
--- /dev/null
@@ -0,0 +1,49 @@
+From ffdb3fad79cf70dcc943764f075215d6525435be Mon Sep 17 00:00:00 2001
+From: Robert Nelson <robertcnelson@gmail.com>
+Date: Sat, 1 Jun 2013 16:32:54 -0500
+Subject: [PATCH 10/10] Revert "regulator: twl: Remove references to 32kHz
+ clock from DT bindings"
+
+This reverts commit 0e8e5c34cf1a8beaaf0a6a05c053592693bf8cb4.
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ Documentation/devicetree/bindings/regulator/twl-regulator.txt |    1 +
+ drivers/regulator/twl-regulator.c                             |    2 ++
+ 2 files changed, 3 insertions(+)
+
+diff --git a/Documentation/devicetree/bindings/regulator/twl-regulator.txt b/Documentation/devicetree/bindings/regulator/twl-regulator.txt
+index 658749b..0c3395d 100644
+--- a/Documentation/devicetree/bindings/regulator/twl-regulator.txt
++++ b/Documentation/devicetree/bindings/regulator/twl-regulator.txt
+@@ -15,6 +15,7 @@ For twl6030 regulators/LDOs
+   - "ti,twl6030-vusb" for VUSB LDO
+   - "ti,twl6030-v1v8" for V1V8 LDO
+   - "ti,twl6030-v2v1" for V2V1 LDO
++  - "ti,twl6030-clk32kg" for CLK32KG RESOURCE
+   - "ti,twl6030-vdd1" for VDD1 SMPS
+   - "ti,twl6030-vdd2" for VDD2 SMPS
+   - "ti,twl6030-vdd3" for VDD3 SMPS
+diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c
+index 5a18317..40f27bb 100644
+--- a/drivers/regulator/twl-regulator.c
++++ b/drivers/regulator/twl-regulator.c
+@@ -1054,6 +1054,7 @@ static u8 twl_get_smps_mult(void)
+ #define TWL6030_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWL6030, label)
+ #define TWL6025_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWL6025, label)
+ #define TWLFIXED_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLFIXED, label)
++#define TWLRES_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLRES, label)
+ #define TWLSMPS_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLSMPS, label)
+ static const struct of_device_id twl_of_match[] = {
+@@ -1101,6 +1102,7 @@ static const struct of_device_id twl_of_match[] = {
+       TWLFIXED_OF_MATCH("ti,twl6030-vusb", VUSB),
+       TWLFIXED_OF_MATCH("ti,twl6030-v1v8", V1V8),
+       TWLFIXED_OF_MATCH("ti,twl6030-v2v1", V2V1),
++      TWLRES_OF_MATCH("ti,twl6030-clk32kg", CLK32KG),
+       TWLSMPS_OF_MATCH("ti,twl6025-smps3", SMPS3),
+       TWLSMPS_OF_MATCH("ti,twl6025-smps4", SMPS4),
+       TWLSMPS_OF_MATCH("ti,twl6025-vio", VIO),
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/panda/0011-panda-spidev-setup-pinmux.patch b/src/patches/kernel/omap/panda/0011-panda-spidev-setup-pinmux.patch
new file mode 100644 (file)
index 0000000..da9fcda
--- /dev/null
@@ -0,0 +1,50 @@
+From 9f5066a898b77f2fe2b1f0946bb6afebe3d08f6d Mon Sep 17 00:00:00 2001
+From: Yann <yann.wanwanscappel@free.fr>
+Date: Sat, 8 Jun 2013 13:06:37 -0500
+Subject: [PATCH 7/7] panda: spidev: setup pinmux
+
+It works fine on my board, I've been able to perform data transfers using the spidev_test program provided in kernel documentation
+(shortcut between SIMO and SOMI to perform an hardware loopback). I also checked that CS0 and CS1 and CLK are properly driven using my scope.
+
+The clock is strangely configured as input, but it is also the case for omap3 beagle board, so I guess this is fine.
+
+Signed-off-by: Yann <yann.wanwanscappel@free.fr>
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ arch/arm/mach-omap2/board-omap4panda.c |   13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
+index 3563f86..10bb576 100644
+--- a/arch/arm/mach-omap2/board-omap4panda.c
++++ b/arch/arm/mach-omap2/board-omap4panda.c
+@@ -103,6 +103,16 @@ static struct platform_device leds_gpio = {
+       },
+ };
++static void __init omap4_panda_config_mcspi1_mux(void)
++{
++      /* NOTE: Clock pins need to be in input mode */
++      omap_mux_init_signal("mcspi1_clk", OMAP_PIN_INPUT);
++      omap_mux_init_signal("mcspi1_simo", OMAP_PIN_OUTPUT);
++      omap_mux_init_signal("mcspi1_somi", OMAP_PIN_INPUT_PULLUP);
++      omap_mux_init_signal("mcspi1_cs0", OMAP_PIN_OUTPUT);
++      omap_mux_init_signal("mcspi1_cs1", OMAP_PIN_OUTPUT);
++}
++
+ static struct spi_board_info panda_mcspi_board_info[] = {
+       /* spi 1.0 */
+       {
+@@ -472,7 +482,8 @@ static void __init omap4_panda_init(void)
+       omap4_ehci_init();
+       if (!strcmp(expboard_name, "spidev")) {
+       #if IS_ENABLED(CONFIG_SPI_SPIDEV)
+-              pr_info("Panda expansionboard: spidev: enabling spi3/spi4\n");
++              pr_info("Panda expansionboard: spidev: enabling spi1.0 and spi1.1\n");
++              omap4_panda_config_mcspi1_mux();
+               spi_register_board_info(panda_mcspi_board_info, ARRAY_SIZE(panda_mcspi_board_info));
+       #endif
+       }
+-- 
+1.7.10.4
+
diff --git a/src/patches/kernel/omap/sakoman/0001-OMAP-DSS2-add-bootarg-for-selecting-svideo.patch b/src/patches/kernel/omap/sakoman/0001-OMAP-DSS2-add-bootarg-for-selecting-svideo.patch
new file mode 100644 (file)
index 0000000..8e8a08e
--- /dev/null
@@ -0,0 +1,78 @@
+From 6bce72b21600d9f52ae60d5bf80d00152eb75b50 Mon Sep 17 00:00:00 2001
+From: Steve Sakoman <steve@sakoman.com>
+Date: Tue, 19 Jan 2010 21:19:15 -0800
+Subject: [PATCH 1/2] OMAP: DSS2: add bootarg for selecting svideo
+
+ OMAP: DSS2: add bootarg for selecting svideo or composite for tv output
+ also add pal-16 and ntsc-16 omapfb.mode settings for 16bpp
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/video/omap2/dss/venc.c           |   22 ++++++++++++++++++++++
+ drivers/video/omap2/omapfb/omapfb-main.c |   10 +++++++++-
+ 2 files changed, 31 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
+index 56efa3b..d46f7f8 100644
+--- a/drivers/video/omap2/dss/venc.c
++++ b/drivers/video/omap2/dss/venc.c
+@@ -86,6 +86,11 @@
+ #define VENC_OUTPUT_TEST                      0xC8
+ #define VENC_DAC_B__DAC_C                     0xC8
++static char *tv_connection;
++
++module_param_named(tvcable, tv_connection, charp, 0);
++MODULE_PARM_DESC(tvcable, "TV connection type (svideo, composite)");
++
+ struct venc_config {
+       u32 f_control;
+       u32 vidout_ctrl;
+@@ -465,6 +470,23 @@ static int venc_power_on(struct omap_dss_device *dssdev)
+       if (r)
+               goto err2;
++      /* Allow the TV output to be overriden */
++      if (tv_connection) {
++              if (strcmp(tv_connection, "svideo") == 0) {
++                      printk(KERN_INFO
++                              "omapdss: tv output is svideo.\n");
++                      dssdev->phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO;
++              } else if (strcmp(tv_connection, "composite") == 0) {
++                      printk(KERN_INFO
++                              "omapdss: tv output is composite.\n");
++                      dssdev->phy.venc.type = OMAP_DSS_VENC_TYPE_COMPOSITE;
++              } else {
++                      printk(KERN_INFO
++                              "omapdss: unsupported output type'%s'.\n",
++                              tv_connection);
++              }
++      }
++
+       return 0;
+ err2:
+diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
+index bc225e4..34d6679 100644
+--- a/drivers/video/omap2/omapfb/omapfb-main.c
++++ b/drivers/video/omap2/omapfb/omapfb-main.c
+@@ -2032,7 +2032,15 @@ static int omapfb_mode_to_timings(const char *mode_str,
+       int r;
+ #ifdef CONFIG_OMAP2_DSS_VENC
+-      if (strcmp(mode_str, "pal") == 0) {
++      if (strcmp(mode_str, "pal-16") == 0) {
++              *timings = omap_dss_pal_timings;
++              *bpp = 16;
++              return 0;
++      } else if (strcmp(mode_str, "ntsc-16") == 0) {
++              *timings = omap_dss_ntsc_timings;
++              *bpp = 16;
++              return 0;
++      } else if (strcmp(mode_str, "pal") == 0) {
+               *timings = omap_dss_pal_timings;
+               *bpp = 24;
+               return 0;
+-- 
+1.7.7.6
+
diff --git a/src/patches/kernel/omap/sakoman/0002-video-add-timings-for-hd720.patch b/src/patches/kernel/omap/sakoman/0002-video-add-timings-for-hd720.patch
new file mode 100644 (file)
index 0000000..1b936f5
--- /dev/null
@@ -0,0 +1,28 @@
+From 747de06d5cc69b2407684ba0455fff5c1d6af797 Mon Sep 17 00:00:00 2001
+From: Steve Sakoman <steve@sakoman.com>
+Date: Sat, 19 Dec 2009 06:52:43 -0800
+Subject: [PATCH 2/2] video: add timings for hd720
+
+Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
+---
+ drivers/video/modedb.c |    4 ++++
+ 1 files changed, 4 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/video/modedb.c b/drivers/video/modedb.c
+index a9a907c..5b686de 100644
+--- a/drivers/video/modedb.c
++++ b/drivers/video/modedb.c
+@@ -103,6 +103,10 @@ static const struct fb_videomode modedb[] = {
+       { NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6, 0,
+               FB_VMODE_NONINTERLACED },
++      /* 1280x720 @ 60 Hz, 45 kHz hsync, CEA 681-E Format 4 */
++      { "hd720", 60, 1280, 720, 13468, 220, 110, 20, 5, 40, 5, 0,
++              FB_VMODE_NONINTERLACED },
++
+       /* 1280x1024 @ 87 Hz interlaced, 51 kHz hsync */
+       { NULL, 87, 1280, 1024, 12500, 56, 16, 128, 1, 216, 12, 0,
+               FB_VMODE_INTERLACED },
+-- 
+1.7.7.6
+
diff --git a/src/patches/kernel/omap/sgx/0001-arm-Export-cache-flush-management-symbols-when-MULTI.patch b/src/patches/kernel/omap/sgx/0001-arm-Export-cache-flush-management-symbols-when-MULTI.patch
new file mode 100644 (file)
index 0000000..1ca1e70
--- /dev/null
@@ -0,0 +1,34 @@
+From 29885f2f3d700341d322274db6ad085e601c0994 Mon Sep 17 00:00:00 2001
+From: Pantelis Antoniou <panto@antoniou-consulting.com>
+Date: Fri, 4 Jan 2013 00:32:33 +0200
+Subject: [PATCH 3/3] arm: Export cache flush management symbols when
+ !MULTI_CACHE
+
+When compiling a kernel without CONFIG_MULTI_CACHE enabled the
+dma access functions end up not being exported. Fix it.
+
+Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com>
+---
+ arch/arm/kernel/setup.c |    9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
+index da1d1aa..dcb678c 100644
+--- a/arch/arm/kernel/setup.c
++++ b/arch/arm/kernel/setup.c
+@@ -923,3 +923,12 @@ const struct seq_operations cpuinfo_op = {
+       .stop   = c_stop,
+       .show   = c_show
+ };
++
++/* export the cache management functions */
++#ifndef MULTI_CACHE
++
++EXPORT_SYMBOL(__glue(_CACHE,_dma_map_area));
++EXPORT_SYMBOL(__glue(_CACHE,_dma_unmap_area));
++EXPORT_SYMBOL(__glue(_CACHE,_dma_flush_range));
++
++#endif
+-- 
+1.7.10.4
+