summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/board-bonaire.c
diff options
context:
space:
mode:
authorKunal Agrawal <kunala@nvidia.com>2013-03-01 10:23:42 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 13:23:03 -0700
commit26a08d998034733066d3e09498f72d3542e277a9 (patch)
treee6fd57b985731ccf7c948913c5d4398ee4688447 /arch/arm/mach-tegra/board-bonaire.c
parentc188569dd4b829ca2be8cab50b98b53505707565 (diff)
ARM: tegra: bonaire: add SPI support
added code to enable and initialize spi on bonaire platform Change-Id: I91bc591c8949c9c61512c60daa0794a95622d93c Signed-off-by: Kunal Agrawal <kunala@nvidia.com> Reviewed-on: http://git-master/r/205377 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Venu Byravarasu <vbyravarasu@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/board-bonaire.c')
-rw-r--r--arch/arm/mach-tegra/board-bonaire.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/board-bonaire.c b/arch/arm/mach-tegra/board-bonaire.c
index 92109711b4a3..b85507b77ea9 100644
--- a/arch/arm/mach-tegra/board-bonaire.c
+++ b/arch/arm/mach-tegra/board-bonaire.c
@@ -26,6 +26,8 @@
#include <linux/clk.h>
#include <linux/serial_8250.h>
#include <linux/i2c.h>
+#include <linux/spi/spi.h>
+#include <linux/spi-tegra.h>
#include <linux/i2c/panjit_ts.h>
#include <linux/dma-mapping.h>
#include <linux/delay.h>
@@ -216,6 +218,53 @@ static void bonaire_i2c_init(void)
platform_device_register(&tegra14_i2c_device1);
}
+static struct platform_device *bonaire_spi_devices[] __initdata = {
+ &tegra11_spi_device4,
+};
+
+struct spi_clk_parent spi_parent_clk_bonaire[] = {
+ [0] = {.name = "pll_p"},
+#ifndef CONFIG_TEGRA_PLLM_RESTRICTED
+ [1] = {.name = "pll_m"},
+ [2] = {.name = "clk_m"},
+#else
+ [1] = {.name = "clk_m"},
+#endif
+};
+
+static struct tegra_spi_platform_data bonaire_spi_pdata = {
+ .is_dma_based = true,
+ .max_dma_buffer = 16 * 1024,
+ .is_clkon_always = false,
+ .max_rate = 25000000,
+};
+
+static void __init bonaire_spi_init(void)
+{
+ int i;
+ struct clk *c;
+ struct board_info board_info, display_board_info;
+
+ tegra_get_board_info(&board_info);
+ tegra_get_display_board_info(&display_board_info);
+
+ for (i = 0; i < ARRAY_SIZE(spi_parent_clk_bonaire); ++i) {
+ c = tegra_get_clock_by_name(spi_parent_clk_bonaire[i].name);
+ if (IS_ERR_OR_NULL(c)) {
+ pr_err("Not able to get the clock for %s\n",
+ spi_parent_clk_bonaire[i].name);
+ continue;
+ }
+ spi_parent_clk_bonaire[i].parent_clk = c;
+ spi_parent_clk_bonaire[i].fixed_clk_rate = clk_get_rate(c);
+ }
+ bonaire_spi_pdata.parent_clk_list = spi_parent_clk_bonaire;
+ bonaire_spi_pdata.parent_clk_count = ARRAY_SIZE(spi_parent_clk_bonaire);
+ tegra11_spi_device4.dev.platform_data = &bonaire_spi_pdata;
+ platform_add_devices(bonaire_spi_devices,
+ ARRAY_SIZE(bonaire_spi_devices));
+}
+
#define GPIO_KEY(_id, _gpio, _iswake) \
{ \
.code = _id, \
@@ -566,6 +615,7 @@ static void __init tegra_bonaire_init(void)
bonaire_hs_uart_init();
bonaire_sdhci_init();
bonaire_i2c_init();
+ bonaire_spi_init();
bonaire_regulator_init();
bonaire_suspend_init();
bonaire_touch_init();