1/* 2 * ATSTK1003 daughterboard-specific init code 3 * 4 * Copyright (C) 2007 Atmel Corporation 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10#include <linux/clk.h> 11#include <linux/err.h> 12#include <linux/init.h> 13#include <linux/kernel.h> 14#include <linux/platform_device.h> 15#include <linux/string.h> 16#include <linux/types.h> 17 18#include <linux/spi/at73c213.h> 19#include <linux/spi/spi.h> 20#include <linux/atmel-mci.h> 21 22#include <video/atmel_lcdc.h> 23 24#include <asm/setup.h> 25 26#include <mach/at32ap700x.h> 27#include <mach/board.h> 28#include <mach/init.h> 29#include <mach/portmux.h> 30 31#include "atstk1000.h" 32 33/* Oscillator frequencies. These are board specific */ 34unsigned long at32_board_osc_rates[3] = { 35 [0] = 32768, /* 32.768 kHz on RTC osc */ 36 [1] = 20000000, /* 20 MHz on osc0 */ 37 [2] = 12000000, /* 12 MHz on osc1 */ 38}; 39 40#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC 41static struct at73c213_board_info at73c213_data = { 42 .ssc_id = 0, 43 .shortname = "AVR32 STK1000 external DAC", 44}; 45#endif 46 47#ifndef CONFIG_BOARD_ATSTK100X_SW1_CUSTOM 48static struct spi_board_info spi0_board_info[] __initdata = { 49#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC 50 { 51 /* AT73C213 */ 52 .modalias = "at73c213", 53 .max_speed_hz = 200000, 54 .chip_select = 0, 55 .mode = SPI_MODE_1, 56 .platform_data = &at73c213_data, 57 }, 58#endif 59 { 60 /* QVGA display */ 61 .modalias = "ltv350qv", 62 .max_speed_hz = 16000000, 63 .chip_select = 1, 64 .mode = SPI_MODE_3, 65 }, 66}; 67#endif 68 69#ifdef CONFIG_BOARD_ATSTK100X_SPI1 70static struct spi_board_info spi1_board_info[] __initdata = { { 71 /* patch in custom entries here */ 72} }; 73#endif 74 75#ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM 76static struct mci_platform_data __initdata mci0_data = { 77 .slot[0] = { 78 .bus_width = 4, 79 .detect_pin = -ENODEV, 80 .wp_pin = -ENODEV, 81 }, 82}; 83#endif 84 85#ifdef CONFIG_BOARD_ATSTK1000_EXTDAC 86static void __init atstk1004_setup_extdac(void) 87{ 88 struct clk *gclk; 89 struct clk *pll; 90 91 gclk = clk_get(NULL, "gclk0"); 92 if (IS_ERR(gclk)) 93 goto err_gclk; 94 pll = clk_get(NULL, "pll0"); 95 if (IS_ERR(pll)) 96 goto err_pll; 97 98 if (clk_set_parent(gclk, pll)) { 99 pr_debug("STK1000: failed to set pll0 as parent for DAC clock\n"); 100 goto err_set_clk; 101 } 102 103 at32_select_periph(GPIO_PIOA_BASE, (1 << 30), GPIO_PERIPH_A, 0); 104 at73c213_data.dac_clk = gclk; 105 106err_set_clk: 107 clk_put(pll); 108err_pll: 109 clk_put(gclk); 110err_gclk: 111 return; 112} 113#else 114static void __init atstk1004_setup_extdac(void) 115{ 116 117} 118#endif /* CONFIG_BOARD_ATSTK1000_EXTDAC */ 119 120void __init setup_board(void) 121{ 122#ifdef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM 123 at32_map_usart(0, 1, 0); /* USART 0/B: /dev/ttyS1, IRDA */ 124#else 125 at32_map_usart(1, 0, 0); /* USART 1/A: /dev/ttyS0, DB9 */ 126#endif 127 /* USART 2/unused: expansion connector */ 128 at32_map_usart(3, 2, 0); /* USART 3/C: /dev/ttyS2, DB9 */ 129 130 at32_setup_serial_console(0); 131} 132 133static int __init atstk1004_init(void) 134{ 135#ifdef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM 136 at32_add_device_usart(1); 137#else 138 at32_add_device_usart(0); 139#endif 140 at32_add_device_usart(2); 141 142#ifndef CONFIG_BOARD_ATSTK100X_SW1_CUSTOM 143 at32_add_device_spi(0, spi0_board_info, ARRAY_SIZE(spi0_board_info)); 144#endif 145#ifdef CONFIG_BOARD_ATSTK100X_SPI1 146 at32_add_device_spi(1, spi1_board_info, ARRAY_SIZE(spi1_board_info)); 147#endif 148#ifndef CONFIG_BOARD_ATSTK100X_SW2_CUSTOM 149 at32_add_device_mci(0, &mci0_data); 150#endif 151 at32_add_device_lcdc(0, &atstk1000_lcdc_data, 152 fbmem_start, fbmem_size, 153 ATMEL_LCDC_PRI_24BIT | ATMEL_LCDC_PRI_CONTROL); 154 at32_add_device_usba(0, NULL); 155#ifndef CONFIG_BOARD_ATSTK100X_SW3_CUSTOM 156 at32_add_device_ssc(0, ATMEL_SSC_TX); 157#endif 158 159 atstk1000_setup_j2_leds(); 160 atstk1004_setup_extdac(); 161 162 return 0; 163} 164postcore_initcall(atstk1004_init); 165