2 * Code for Ka-Ro electronics GmbH TX48 module with TI AM335X.
3 * (C) Copyright 2013 Lothar Waßmann <LW@KARO-electronics.de>
5 * based on board-am335xevm.c
6 * Copyright (C) 2011 Texas Instruments, Inc. - http://www.ti.com/
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation version 2.
12 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
13 * kind, whether express or implied; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 #include <linux/kernel.h>
18 #include <linux/init.h>
19 #include <linux/i2c.h>
20 #include <linux/module.h>
21 #include <linux/i2c/at24.h>
22 #include <linux/phy.h>
23 #include <linux/gpio.h>
24 #include <linux/spi/spi.h>
25 #include <linux/gpio_keys.h>
26 #include <linux/input.h>
27 #include <linux/input/matrix_keypad.h>
28 #include <linux/mtd/mtd.h>
29 #include <linux/mtd/nand.h>
30 #include <linux/mtd/partitions.h>
31 #include <linux/platform_device.h>
32 #include <linux/clk.h>
33 #include <linux/err.h>
34 #include <linux/export.h>
35 #include <linux/wl12xx.h>
36 #include <linux/ethtool.h>
37 #include <linux/pwm_backlight.h>
38 #include <linux/input/ti_tsc.h>
39 #include <linux/platform_data/ti_adc.h>
40 #include <linux/mfd/ti_tscadc.h>
41 #include <linux/reboot.h>
42 #include <linux/pwm/pwm.h>
43 #include <linux/rtc/rtc-omap.h>
44 #include <linux/opp.h>
45 #include <linux/i2c/tsc2007.h>
47 /* LCD controller is similar to DA850 */
48 #include <video/da8xx-fb.h>
50 #include <mach/hardware.h>
52 #include <asm/mach-types.h>
53 #include <asm/mach/arch.h>
54 #include <asm/mach/map.h>
55 #include <asm/hardware/asp.h>
57 #include <plat/omap_device.h>
58 #include <plat/omap-pm.h>
59 #include <plat/irqs.h>
60 #include <plat/board.h>
61 #include <plat/common.h>
62 #include <plat/lcdc.h>
65 #include <plat/emif.h>
66 #include <plat/nand.h>
69 #include "board-flash.h"
70 #include "cpuidle33xx.h"
75 void am33xx_d_can_init(unsigned int instance);
77 /* Convert GPIO signal to GPIO pin number */
78 #define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
80 enum tx48_baseboards {
85 static enum tx48_baseboards tx48_baseboard __initdata = STK5_V3;
87 static int __init tx48_setup_baseboard(char *option)
89 if (strcasecmp(option, "stk5-v5") == 0)
90 tx48_baseboard = STK5_V5;
95 __setup("tx48_base=", tx48_setup_baseboard);
97 static const struct display_panel disp_panel = {
104 /* module pin mux structure */
105 struct pinmux_config {
106 const char *string_name; /* signal name format */
107 int val; /* Options for the mux register value */
110 static void setup_pin_mux(const struct pinmux_config *pin_mux)
114 for (i = 0; pin_mux->string_name != NULL; pin_mux++)
115 omap_mux_init_signal(pin_mux->string_name, pin_mux->val);
118 /* LCD backlight platform Data */
119 #define STK5_BACKLIGHT_MAX_BRIGHTNESS 100
120 #define STK5_BACKLIGHT_DEFAULT_BRIGHTNESS 100
121 #define STK5_PWM_PERIOD_NANO_SECONDS (5000 * 10)
122 #define STK5_BACKLIGHT_GPIO GPIO_TO_PIN(3, 16)
124 static struct platform_pwm_backlight_data stk5_backlight_data;
126 /* Module pin mux for EHRPWM */
127 static const struct pinmux_config ehrpwm0_pin_mux[] = {
128 { "mcasp0_aclkx.ehrpwm0a", AM33XX_PIN_OUTPUT, },
132 static const struct pinmux_config ehrpwm0_gpio_pin_mux[] = {
133 { "mcasp0_aclkx.gpio3_14", AM33XX_PIN_OUTPUT, },
137 static struct lcd_ctrl_config lcd_cfg = {
147 .invert_line_clock = 1,
148 .invert_frm_clock = 1,
149 .invert_pixel_clock = 1,
155 static struct da8xx_lcdc_platform_data stk5_lcdc_pdata = {
156 .controller_data = &lcd_cfg,
160 static struct tsc_data stk5_touchscreen_data = {
162 .x_plate_resistance = 200,
163 .steps_to_configure = 5,
166 static struct adc_data stk5_adc_data = {
170 static struct mfd_tscadc_board tscadc = {
171 .tsc_init = &stk5_touchscreen_data,
172 .adc_init = &stk5_adc_data,
175 static u8 stk5_iis_serializer_direction1[] = {
176 INACTIVE_MODE, INACTIVE_MODE, TX_MODE, RX_MODE,
177 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
178 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
179 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
182 static struct snd_platform_data stk5_snd_data1 = {
183 .tx_dma_offset = 0x46400000, /* McASP1 */
184 .rx_dma_offset = 0x46400000,
185 .op_mode = DAVINCI_MCASP_IIS_MODE,
187 .serial_dir = stk5_iis_serializer_direction1,
188 .num_serializer = ARRAY_SIZE(stk5_iis_serializer_direction1),
189 .asp_chan_q = EVENTQ_2,
190 .version = MCASP_VERSION_3,
193 .get_context_loss_count =
194 omap_pm_get_dev_context_loss_count,
197 static struct omap2_hsmmc_info stk5_mmc[] __initdata = {
200 .caps = MMC_CAP_4_BIT_DATA,
201 .gpio_cd = GPIO_TO_PIN(3, 15),
202 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3V3 */
207 /* Module pin mux for LCDC */
208 static const struct pinmux_config lcdc_pin_mux[] __initconst = {
209 { "lcd_data0.lcd_data0", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
210 { "lcd_data1.lcd_data1", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
211 { "lcd_data2.lcd_data2", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
212 { "lcd_data3.lcd_data3", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
213 { "lcd_data4.lcd_data4", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
214 { "lcd_data5.lcd_data5", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
215 { "lcd_data6.lcd_data6", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
216 { "lcd_data7.lcd_data7", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
217 { "lcd_data8.lcd_data8", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
218 { "lcd_data9.lcd_data9", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
219 { "lcd_data10.lcd_data10", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
220 { "lcd_data11.lcd_data11", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
221 { "lcd_data12.lcd_data12", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
222 { "lcd_data13.lcd_data13", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
223 { "lcd_data14.lcd_data14", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
224 { "lcd_data15.lcd_data15", AM33XX_PIN_OUTPUT | AM33XX_PULL_DISA, },
225 { "gpmc_ad8.lcd_data16", AM33XX_PIN_OUTPUT, },
226 { "gpmc_ad9.lcd_data17", AM33XX_PIN_OUTPUT, },
227 { "gpmc_ad10.lcd_data18", AM33XX_PIN_OUTPUT, },
228 { "gpmc_ad11.lcd_data19", AM33XX_PIN_OUTPUT, },
229 { "gpmc_ad12.lcd_data20", AM33XX_PIN_OUTPUT, },
230 { "gpmc_ad13.lcd_data21", AM33XX_PIN_OUTPUT, },
231 { "gpmc_ad14.lcd_data22", AM33XX_PIN_OUTPUT, },
232 { "gpmc_ad15.lcd_data23", AM33XX_PIN_OUTPUT, },
233 { "lcd_vsync.lcd_vsync", AM33XX_PIN_OUTPUT, },
234 { "lcd_hsync.lcd_hsync", AM33XX_PIN_OUTPUT, },
235 { "lcd_pclk.lcd_pclk", AM33XX_PIN_OUTPUT, },
236 { "lcd_ac_bias_en.lcd_ac_bias_en", AM33XX_PIN_OUTPUT, },
237 { "gpmc_a3.gpio1_19", AM33XX_PIN_OUTPUT, }, /* LCD RESET */
238 { "gpmc_a6.gpio1_22", AM33XX_PIN_OUTPUT, }, /* LCD POWER */
242 /* Pin mux for nand flash module */
243 static const struct pinmux_config nand_pin_mux[] __initconst = {
244 { "gpmc_ad0.gpmc_ad0", AM33XX_PIN_INPUT_PULLUP, },
245 { "gpmc_ad1.gpmc_ad1", AM33XX_PIN_INPUT_PULLUP, },
246 { "gpmc_ad2.gpmc_ad2", AM33XX_PIN_INPUT_PULLUP, },
247 { "gpmc_ad3.gpmc_ad3", AM33XX_PIN_INPUT_PULLUP, },
248 { "gpmc_ad4.gpmc_ad4", AM33XX_PIN_INPUT_PULLUP, },
249 { "gpmc_ad5.gpmc_ad5", AM33XX_PIN_INPUT_PULLUP, },
250 { "gpmc_ad6.gpmc_ad6", AM33XX_PIN_INPUT_PULLUP, },
251 { "gpmc_ad7.gpmc_ad7", AM33XX_PIN_INPUT_PULLUP, },
252 { "gpmc_wait0.gpmc_wait0", AM33XX_PIN_INPUT_PULLUP, },
253 { "gpmc_wpn.gpmc_wpn", AM33XX_PIN_INPUT_PULLUP, },
254 { "gpmc_csn0.gpmc_csn0", AM33XX_PIN_OUTPUT_PULLUP, },
255 { "gpmc_advn_ale.gpmc_advn_ale", AM33XX_PULL_DISA, },
256 { "gpmc_oen_ren.gpmc_oen_ren", AM33XX_PULL_DISA, },
257 { "gpmc_wen.gpmc_wen", AM33XX_PULL_DISA, },
258 { "gpmc_ben0_cle.gpmc_ben0_cle", AM33XX_PULL_DISA, },
262 /* Module pin mux for SPI */
263 static const struct pinmux_config spi0_pin_mux[] __initconst = {
264 { "spi0_sclk.spi0_sclk", AM33XX_PULL_ENBL | AM33XX_INPUT_EN, },
265 { "spi0_d0.spi0_d0", AM33XX_PIN_INPUT_PULLUP, },
266 { "spi0_d1.spi0_d1", AM33XX_PULL_ENBL | AM33XX_INPUT_EN, },
267 { "spi0_cs0.spi0_cs0", AM33XX_PIN_INPUT_PULLUP, },
271 /* Module pin mux for rmii1 */
272 static const struct pinmux_config rmii1_pin_mux[] __initconst = {
273 { "gmii1_crs.rmii1_crs_dv", AM33XX_PIN_INPUT_PULLDOWN, },
274 { "gmii1_rxerr.rmii1_rxerr", AM33XX_PIN_INPUT_PULLDOWN, },
275 { "gmii1_txen.rmii1_txen", AM33XX_PIN_OUTPUT, },
276 { "gmii1_txd1.rmii1_txd1", AM33XX_PIN_OUTPUT, },
277 { "gmii1_txd0.rmii1_txd0", AM33XX_PIN_OUTPUT, },
278 { "gmii1_rxd1.rmii1_rxd1", AM33XX_PIN_INPUT_PULLUP, },
279 { "gmii1_rxd0.rmii1_rxd0", AM33XX_PIN_INPUT_PULLUP, },
280 { "rmii1_refclk.rmii1_refclk", AM33XX_PIN_INPUT, },
281 { "mdio_data.mdio_data", AM33XX_PIN_INPUT_PULLUP, },
282 { "mdio_clk.mdio_clk", AM33XX_PIN_OUTPUT_PULLUP, },
283 { "emu0.gpio3_7", AM33XX_PIN_INPUT_PULLUP, }, /* nINT */
284 { "emu1.gpio3_8", AM33XX_PIN_OUTPUT_PULLUP, }, /* nRST */
288 /* Module pin mux for mcasp1 */
289 static const struct pinmux_config mcasp1_pin_mux[] __initconst = {
290 { "mcasp0_aclkr.mcasp1_aclkx", AM33XX_PIN_INPUT_PULLDOWN, },
291 { "mcasp0_fsr.mcasp1_fsx", AM33XX_PIN_INPUT_PULLDOWN, },
292 { "mcasp0_axr1.mcasp1_axr0", AM33XX_PIN_INPUT_PULLDOWN, },
293 { "mcasp0_ahclk.mcasp1_axr1", AM33XX_PIN_INPUT_PULLDOWN, },
298 /* Module pin mux for mmc1 */
300 static const struct pinmux_config mmc1_pin_mux[] __initconst = {
302 { "mcasp0_fsx.gpio3_15", AM33XX_PIN_INPUT_PULLUP, },
304 { "mcasp0_fsx.mmc1_sdcd", AM33XX_PIN_INPUT_PULLUP, },
306 { "gmii1_txclk.mmc1_dat0", AM33XX_PIN_INPUT_PULLUP, },
307 { "gmii1_rxclk.mmc1_dat1", AM33XX_PIN_INPUT_PULLUP, },
308 { "gmii1_rxd3.mmc1_dat2", AM33XX_PIN_INPUT_PULLUP, },
309 { "gmii1_rxd2.mmc1_dat3", AM33XX_PIN_INPUT_PULLUP, },
310 { "gpmc_csn2.mmc1_cmd", AM33XX_PIN_INPUT_PULLUP, },
311 { "gpmc_csn1.mmc1_clk", AM33XX_PIN_INPUT_PULLUP, },
315 /* pinmux for led device */
316 static const struct pinmux_config gpio_led_mux[] __initconst = {
317 { "gpmc_a10.gpio1_26", AM33XX_PIN_INPUT, },
321 /* Matrix GPIO Keypad Support */
322 /* pinmux for keypad device */
323 static const struct pinmux_config matrix_keypad_pin_mux[] __initconst = {
324 /* keypad row gpios */
325 { "xdma_event_intr0.gpio0_19", AM33XX_PIN_INPUT_PULLDOWN, },
326 { "xdma_event_intr1.gpio0_20", AM33XX_PIN_INPUT_PULLDOWN, },
327 { "gpmc_clk.gpio2_1", AM33XX_PIN_INPUT_PULLDOWN, },
328 { "gpmc_csn3.gpio2_0", AM33XX_PIN_INPUT_PULLDOWN, },
329 /* keypad col gpios */
330 { "mmc0_dat3.gpio2_26", AM33XX_PIN_OUTPUT, },
331 { "mcasp0_ahclkr.gpio3_17", AM33XX_PIN_OUTPUT, },
332 { "ecap0_in_pwm0_out.gpio0_7", AM33XX_PIN_OUTPUT, },
333 { "gpmc_ben1.gpio1_28", AM33XX_PIN_OUTPUT, },
338 static const uint32_t stk5_matrix_keys[] = {
339 KEY(0, 0, KEY_POWER),
342 static const struct matrix_keymap_data stk5_keymap_data = {
343 .keymap = stk5_matrix_keys,
344 .keymap_size = ARRAY_SIZE(stk5_matrix_keys),
347 static const unsigned int stk5_keypad_row_gpios[] = {
354 static const unsigned int stk5_keypad_col_gpios[] = {
361 static struct matrix_keypad_platform_data stk5_keypad_platform_data = {
362 .keymap_data = &stk5_keymap_data,
363 .row_gpios = stk5_keypad_row_gpios,
364 .num_row_gpios = ARRAY_SIZE(stk5_keypad_row_gpios),
365 .col_gpios = stk5_keypad_col_gpios,
366 .num_col_gpios = ARRAY_SIZE(stk5_keypad_col_gpios),
368 .col_scan_delay_us = 2,
372 static struct platform_device stk5_keyboard = {
373 .name = "matrix-keypad",
376 .platform_data = &stk5_keypad_platform_data,
380 static void __init matrix_keypad_init(void)
384 setup_pin_mux(matrix_keypad_pin_mux);
385 err = platform_device_register(&stk5_keyboard);
387 pr_err("failed to register matrix keypad (%ux%u) device\n",
388 ARRAY_SIZE(stk5_keypad_col_gpios),
389 ARRAY_SIZE(stk5_keypad_row_gpios));
392 /* pinmux for usb0 drvvbus */
393 static const struct pinmux_config usb0_pin_mux[] __initconst = {
394 { "usb0_drvvbus.usb0_drvvbus", AM33XX_PIN_OUTPUT, },
398 /* pinmux for usb1 drvvbus */
399 static const struct pinmux_config usb1_pin_mux[] __initconst = {
400 { "usb1_drvvbus.usb1_drvvbus", AM33XX_PIN_OUTPUT, },
404 static bool backlight_enable;
406 static void __init enable_ehrpwm0(void)
408 backlight_enable = true;
409 setup_pin_mux(ehrpwm0_pin_mux);
412 /* Setup pwm-backlight */
413 static struct platform_pwm_backlight_data stk5_backlight_data = {
414 .pwm_id = "ehrpwm.0",
417 .max_brightness = STK5_BACKLIGHT_MAX_BRIGHTNESS,
418 .dft_brightness = STK5_BACKLIGHT_DEFAULT_BRIGHTNESS,
419 .pwm_period_ns = 50000,
422 static struct platform_device stk5_backlight = {
423 .name = "pwm-backlight",
426 .platform_data = &stk5_backlight_data,
430 static struct pwmss_platform_data pwm_pdata = {
431 .version = PWM_VERSION_1,
434 static int __init backlight_init(void)
438 if (backlight_enable) {
439 struct pwm_device *pwm;
440 struct platform_pwm_backlight_data *bd = &stk5_backlight_data;
442 am33xx_register_ehrpwm(0, &pwm_pdata);
443 pwm = pwm_request(bd->pwm_id, bd->ch, "backlight");
447 pwm_set_polarity(pwm, 1);
449 status = platform_device_register(&stk5_backlight);
453 late_initcall(backlight_init);
455 static int __init conf_disp_pll(int rate)
457 struct clk *disp_pll;
460 disp_pll = clk_get(NULL, "dpll_disp_ck");
461 if (IS_ERR(disp_pll)) {
462 pr_err("Cannot clk_get disp_pll\n");
466 ret = clk_set_rate(disp_pll, rate);
472 static const struct gpio stk5_lcdc_gpios[] __initconst = {
473 { GPIO_TO_PIN(1, 19), GPIOF_OUT_INIT_HIGH, "LCD reset", },
474 { GPIO_TO_PIN(1, 22), GPIOF_OUT_INIT_HIGH, "LCD power", },
477 static void __init lcdc_init(void)
479 setup_pin_mux(lcdc_pin_mux);
481 if (conf_disp_pll(300000000)) {
482 pr_err("Failed configure display PLL, not attempting to register LCDC\n");
485 gpio_request_array(stk5_lcdc_gpios, ARRAY_SIZE(stk5_lcdc_gpios));
487 stk5_lcdc_pdata.get_context_loss_count = omap_pm_get_dev_context_loss_count;
488 if (am33xx_register_lcdc(&stk5_lcdc_pdata))
489 pr_err("Failed to register LCDC device\n");
492 static void __init mfd_tscadc_init(void)
496 err = am33xx_register_mfd_tscadc(&tscadc);
498 pr_err("failed to register touchscreen device\n");
501 static void __init rmii1_init(void)
503 setup_pin_mux(rmii1_pin_mux);
506 static void __init usb0_init(void)
508 setup_pin_mux(usb0_pin_mux);
511 static void __init usb1_init(void)
513 setup_pin_mux(usb1_pin_mux);
516 /* setup uart pins */
517 /* Module pin mux for uart0 */
518 static const struct pinmux_config uart0_pin_mux[] __initconst = {
519 { "uart0_rxd.uart0_rxd", AM33XX_SLEWCTRL_SLOW |
520 AM33XX_PIN_INPUT_PULLUP, },
521 { "uart0_txd.uart0_txd", AM33XX_PULL_UP | AM33XX_PULL_DISA |
522 AM33XX_SLEWCTRL_SLOW, },
523 { "uart0_rtsn.uart0_rtsn", AM33XX_SLEWCTRL_SLOW |
524 AM33XX_PIN_INPUT_PULLUP, },
525 { "uart0_ctsn.uart0_ctsn", AM33XX_PULL_UP | AM33XX_PULL_DISA |
526 AM33XX_SLEWCTRL_SLOW, },
530 static const struct pinmux_config uart1_pin_mux[] __initconst = {
531 { "uart1_rxd.uart1_rxd", AM33XX_SLEWCTRL_SLOW |
532 AM33XX_PIN_INPUT_PULLUP, },
533 { "uart1_txd.uart1_txd", AM33XX_PULL_UP | AM33XX_PULL_DISA |
534 AM33XX_SLEWCTRL_SLOW, },
535 { "uart1_rtsn.uart1_rtsn", AM33XX_SLEWCTRL_SLOW |
536 AM33XX_PIN_INPUT_PULLUP, },
537 { "uart1_ctsn.uart1_ctsn", AM33XX_PULL_UP | AM33XX_PULL_DISA |
538 AM33XX_SLEWCTRL_SLOW, },
542 static const struct pinmux_config uart5_pin_mux[] __initconst = {
543 { "gmii1_col.uart5_rxd", AM33XX_PIN_INPUT_PULLUP, },
544 { "gmii1_rxdv.uart5_txd", AM33XX_PULL_ENBL, },
545 { "mmc0_dat0.uart5_rtsn", AM33XX_PIN_INPUT_PULLUP, },
546 { "mmc0_dat1.uart5_ctsn", AM33XX_PULL_ENBL, },
550 static void __init uart0_init(void)
552 setup_pin_mux(uart0_pin_mux);
555 static void __init uart1_init(void)
557 setup_pin_mux(uart1_pin_mux);
560 static void __init uart5_init(void)
562 setup_pin_mux(uart5_pin_mux);
565 static struct spi_board_info stk5_spi0_slave_info[] = {
567 .modalias = "spidev",
568 .max_speed_hz = 24000000,
573 .modalias = "spidev",
574 .max_speed_hz = 24000000,
580 static struct gpmc_timings stk5_nand_timings = {
598 .wr_data_mux_bus = 0,
601 static void __init tx48_nand_init(void)
603 struct omap_nand_platform_data *pdata;
604 struct gpmc_devices_info gpmc_device[2] = { };
606 setup_pin_mux(nand_pin_mux);
607 pdata = omap_nand_init(NULL, 0, 0, 0, &stk5_nand_timings);
610 pdata->ecc_opt = OMAP_ECC_BCH8_CODE_HW;
611 pdata->elm_used = true;
612 pdata->use_flash_bbt = true;
613 gpmc_device[0].pdata = pdata;
614 gpmc_device[0].flag = GPMC_DEVICE_NAND;
616 omap_init_gpmc(gpmc_device, sizeof(gpmc_device));
620 static const struct pinmux_config tsc2007_pin_mux[] = {
621 { "mcasp0_axr0.gpio3_16", AM33XX_PIN_INPUT_PULLUP |
622 AM33XX_SLEWCTRL_SLOW, },
626 #define TSC2007_PENDOWN_GPIO GPIO_TO_PIN(3, 16)
628 static int tsc2007_get_pendown_state(void)
630 int pd = !gpio_get_value(TSC2007_PENDOWN_GPIO);
631 printk(KERN_DEBUG "Pen is %s\n", pd ? "down" : "up");
635 static int tsc2007_init_hw(void)
639 setup_pin_mux(tsc2007_pin_mux);
641 ret = gpio_request_one(TSC2007_PENDOWN_GPIO, GPIOF_IN, "TSC2007 pendown");
647 static void tsc2007_exit_hw(void)
649 gpio_free(TSC2007_PENDOWN_GPIO);
652 static struct tsc2007_platform_data tsc2007_pdata = {
654 .get_pendown_state = tsc2007_get_pendown_state,
655 .init_platform_hw = tsc2007_init_hw,
656 .exit_platform_hw = tsc2007_exit_hw,
659 static const struct pinmux_config i2c0_pin_mux[] __initconst = {
660 { "i2c0_sda.i2c0_sda", AM33XX_SLEWCTRL_SLOW | AM33XX_PIN_INPUT_PULLUP, },
661 { "i2c0_scl.i2c0_scl", AM33XX_SLEWCTRL_SLOW | AM33XX_PIN_INPUT_PULLUP, },
665 static struct i2c_board_info stk5_i2c0_boardinfo[] = {
667 I2C_BOARD_INFO("tsc2007", 0x48),
668 .irq = 0, /* setup at runtime by i2c0_init() */
669 .platform_data = &tsc2007_pdata,
672 I2C_BOARD_INFO("sgtl5000", 0x0a),
675 I2C_BOARD_INFO("ds1339", 0x68),
679 static void __init i2c0_init(void)
681 setup_pin_mux(i2c0_pin_mux);
682 stk5_i2c0_boardinfo[0].irq = gpio_to_irq(TSC2007_PENDOWN_GPIO);
683 omap_register_i2c_bus(1, 100, stk5_i2c0_boardinfo,
684 ARRAY_SIZE(stk5_i2c0_boardinfo));
688 static void __init mcasp1_init(void)
690 /* Configure McASP */
691 setup_pin_mux(mcasp1_pin_mux);
692 am335x_register_mcasp(&stk5_snd_data1, 1);
695 static const struct pinmux_config d_can0_pin_mux[] __initconst = {
696 { "gmii1_txd3.d_can0_tx", AM33XX_PULL_ENBL, },
697 { "gmii1_txd2.d_can0_rx", AM33XX_PIN_INPUT_PULLUP, },
701 static const struct pinmux_config d_can1_pin_mux[] __initconst = {
702 { "mmc0_clk.d_can1_tx", AM33XX_PULL_ENBL, },
703 { "mmc0_cmd.d_can1_rx", AM33XX_PIN_INPUT_PULLUP, },
707 static const struct pinmux_config can_xcvr_pin_mux[] __initconst = {
708 { "gpmc_ad8.gpio0_22", AM33XX_PIN_OUTPUT_PULLUP, },
712 static int __init d_can_init(int id)
716 setup_pin_mux(d_can0_pin_mux);
719 setup_pin_mux(d_can1_pin_mux);
726 if (tx48_baseboard == STK5_V5) {
727 setup_pin_mux(can_xcvr_pin_mux);
728 gpio_request_one(GPIO_TO_PIN(0, 0), GPIOF_OUT_INIT_LOW, "CAN xcvr");
731 am33xx_d_can_init(id);
735 static void __init mmc1_init(void)
737 setup_pin_mux(mmc1_pin_mux);
738 omap2_hsmmc_init(stk5_mmc);
741 static struct gpio_led gpio_leds[] = {
744 .gpio = GPIO_TO_PIN(1, 26),
745 .default_trigger = "heartbeat",
749 static struct gpio_led_platform_data gpio_led_info = {
751 .num_leds = ARRAY_SIZE(gpio_leds),
754 static struct platform_device leds_gpio = {
758 .platform_data = &gpio_led_info,
762 static void __init gpio_led_init(void)
766 setup_pin_mux(gpio_led_mux);
767 err = platform_device_register(&leds_gpio);
769 pr_err("failed to register gpio led device\n");
773 static void __init spi0_init(void)
775 setup_pin_mux(spi0_pin_mux);
776 spi_register_board_info(stk5_spi0_slave_info,
777 ARRAY_SIZE(stk5_spi0_slave_info));
780 static struct omap_rtc_pdata stk5_rtc_info = {
784 static int __init stk5_rtc_init(void)
789 struct omap_hwmod *oh;
790 struct platform_device *pdev;
791 char *dev_name = "am33xx-rtc";
793 clk = clk_get_sys(dev_name, "rtc_fck");
795 pr_err("rtc: Failed to get RTC clock\n");
799 ret = clk_enable(clk);
801 pr_err("rtc: Clock enable failed: %d\n", ret);
805 base = ioremap(AM33XX_RTC_BASE, SZ_4K);
809 /* Unlock the rtc's registers */
810 writel(0x83e70b13, base + 0x6c);
811 writel(0x95a4f1e0, base + 0x70);
815 * TODO: Need a better way to handle this
816 * Since we want the clock to be running before mmc init
817 * we need to do it before the rtc probe happens
819 writel(0x48, base + 0x54);
826 if (omap_rev() < AM335X_REV_ES2_0)
827 stk5_rtc_info.wakeup_capable = 0;
829 oh = omap_hwmod_lookup("rtc");
831 pr_err("could not look up %s\n", "rtc");
835 pdev = omap_device_build(dev_name, -1, oh, &stk5_rtc_info,
836 sizeof(struct omap_rtc_pdata), NULL, 0, 0);
837 if (WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n",
839 return PTR_ERR(pdev);
843 static struct omap_musb_board_data musb_board_data = {
844 .interface_type = MUSB_INTERFACE_ULPI,
846 * mode[0:3] = USB0PORT's mode
847 * mode[4:7] = USB1PORT's mode
848 * TX48 has USB0 in OTG mode and USB1 in host mode.
850 .mode = (MUSB_HOST << 4) | MUSB_OTG,
855 static void __iomem *am33xx_emif_base;
857 static void __iomem *__init am33xx_get_mem_ctlr(void)
859 am33xx_emif_base = ioremap(AM33XX_EMIF0_BASE, SZ_32K);
861 if (!am33xx_emif_base)
862 pr_warning("%s: Unable to map DDR2 controller", __func__);
864 return am33xx_emif_base;
867 static struct resource am33xx_cpuidle_resources[] = {
869 .start = AM33XX_EMIF0_BASE,
870 .end = AM33XX_EMIF0_BASE + SZ_32K - 1,
871 .flags = IORESOURCE_MEM,
875 /* AM33XX devices support DDR2 power down */
876 static struct am33xx_cpuidle_config am33xx_cpuidle_pdata = {
879 static struct platform_device am33xx_cpuidle_device = {
880 .name = "cpuidle-am33xx",
881 .num_resources = ARRAY_SIZE(am33xx_cpuidle_resources),
882 .resource = am33xx_cpuidle_resources,
884 .platform_data = &am33xx_cpuidle_pdata,
888 static void __init am33xx_cpuidle_init(void)
892 am33xx_cpuidle_pdata.emif_base = am33xx_get_mem_ctlr();
894 ret = platform_device_register(&am33xx_cpuidle_device);
896 pr_warning("AM33XX cpuidle registration failed\n");
900 static void __init am335x_tx48_init(void)
902 am33xx_cpuidle_init();
903 am33xx_mux_init(NULL);
913 am33xx_cpsw_init(AM33XX_CPSW_MODE_RMII, NULL, NULL);
914 omap_sdrc_init(NULL, NULL);
920 usb_musb_init(&musb_board_data);
926 matrix_keypad_init();
927 /* Create an alias for icss clock */
928 if (clk_add_alias("pruss", NULL, "pruss_uart_gclk", NULL))
929 pr_warn("failed to create an alias: icss_uart_gclk --> pruss\n");
930 /* Create an alias for gfx/sgx clock */
931 if (clk_add_alias("sgx_ck", NULL, "gfx_fclk", NULL))
932 pr_warn("failed to create an alias: gfx_fclk --> sgx_ck\n");
935 static void __init am335x_tx48_map_io(void)
937 omap2_set_globals_am33xx();
938 omapam33xx_map_common_io();
941 MACHINE_START(TX48, "am335x-tx48")
942 /* Maintainer: Ka-Ro electronics GmbH */
943 .map_io = am335x_tx48_map_io,
944 .init_early = am33xx_init_early,
945 .init_irq = ti81xx_init_irq,
946 .handle_irq = omap3_intc_handle_irq,
947 .timer = &omap3_am33xx_timer,
948 .init_machine = am335x_tx48_init,