linux/arch/arm/mach-msm/board-qsd8x50.c
<<
>>
Prefs
   1/* Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved.
   2 *
   3 * This program is free software; you can redistribute it and/or modify
   4 * it under the terms of the GNU General Public License version 2 and
   5 * only version 2 as published by the Free Software Foundation.
   6 *
   7 * This program is distributed in the hope that it will be useful,
   8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
   9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10 * GNU General Public License for more details.
  11 *
  12 * You should have received a copy of the GNU General Public License
  13 * along with this program; if not, write to the Free Software
  14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  15 * 02110-1301, USA.
  16 */
  17
  18#include <linux/kernel.h>
  19#include <linux/irq.h>
  20#include <linux/gpio.h>
  21#include <linux/platform_device.h>
  22#include <linux/delay.h>
  23#include <linux/usb/msm_hsusb.h>
  24
  25#include <asm/mach-types.h>
  26#include <asm/mach/arch.h>
  27#include <asm/io.h>
  28#include <asm/setup.h>
  29
  30#include <mach/board.h>
  31#include <mach/irqs.h>
  32#include <mach/sirc.h>
  33#include <mach/gpio.h>
  34
  35#include "devices.h"
  36
  37extern struct sys_timer msm_timer;
  38
  39static const resource_size_t qsd8x50_surf_smc91x_base __initdata = 0x70000300;
  40static const unsigned        qsd8x50_surf_smc91x_gpio __initdata = 156;
  41
  42/* Leave smc91x resources empty here, as we'll fill them in
  43 * at run-time: they vary from board to board, and the true
  44 * configuration won't be known until boot.
  45 */
  46static struct resource smc91x_resources[] = {
  47        [0] = {
  48                .flags = IORESOURCE_MEM,
  49        },
  50        [1] = {
  51                .flags = IORESOURCE_IRQ,
  52        },
  53};
  54
  55static struct platform_device smc91x_device = {
  56        .name           = "smc91x",
  57        .id             = 0,
  58        .num_resources  = ARRAY_SIZE(smc91x_resources),
  59        .resource       = smc91x_resources,
  60};
  61
  62static int __init msm_init_smc91x(void)
  63{
  64        if (machine_is_qsd8x50_surf()) {
  65                smc91x_resources[0].start = qsd8x50_surf_smc91x_base;
  66                smc91x_resources[0].end   = qsd8x50_surf_smc91x_base + 0xff;
  67                smc91x_resources[1].start =
  68                        gpio_to_irq(qsd8x50_surf_smc91x_gpio);
  69                smc91x_resources[1].end   =
  70                        gpio_to_irq(qsd8x50_surf_smc91x_gpio);
  71                platform_device_register(&smc91x_device);
  72        }
  73
  74        return 0;
  75}
  76module_init(msm_init_smc91x);
  77
  78static int hsusb_phy_init_seq[] = {
  79        0x08, 0x31,     /* Increase HS Driver Amplitude */
  80        0x20, 0x32,     /* Enable and set Pre-Emphasis Depth to 10% */
  81        -1
  82};
  83
  84static struct msm_otg_platform_data msm_otg_pdata = {
  85        .phy_init_seq           = hsusb_phy_init_seq,
  86        .mode                   = USB_PERIPHERAL,
  87        .otg_control            = OTG_PHY_CONTROL,
  88};
  89
  90static struct platform_device *devices[] __initdata = {
  91        &msm_device_uart3,
  92        &msm_device_smd,
  93        &msm_device_otg,
  94        &msm_device_hsusb,
  95        &msm_device_hsusb_host,
  96};
  97
  98static void __init qsd8x50_map_io(void)
  99{
 100        msm_map_qsd8x50_io();
 101        msm_clock_init(msm_clocks_8x50, msm_num_clocks_8x50);
 102}
 103
 104static void __init qsd8x50_init_irq(void)
 105{
 106        msm_init_irq();
 107        msm_init_sirc();
 108}
 109
 110static void __init qsd8x50_init(void)
 111{
 112        msm_device_otg.dev.platform_data = &msm_otg_pdata;
 113        msm_device_hsusb.dev.parent = &msm_device_otg.dev;
 114        msm_device_hsusb_host.dev.parent = &msm_device_otg.dev;
 115        platform_add_devices(devices, ARRAY_SIZE(devices));
 116}
 117
 118MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF")
 119#ifdef CONFIG_MSM_DEBUG_UART
 120#endif
 121        .boot_params = PHYS_OFFSET + 0x100,
 122        .map_io = qsd8x50_map_io,
 123        .init_irq = qsd8x50_init_irq,
 124        .init_machine = qsd8x50_init,
 125        .timer = &msm_timer,
 126MACHINE_END
 127
 128MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5")
 129#ifdef CONFIG_MSM_DEBUG_UART
 130#endif
 131        .boot_params = PHYS_OFFSET + 0x100,
 132        .map_io = qsd8x50_map_io,
 133        .init_irq = qsd8x50_init_irq,
 134        .init_machine = qsd8x50_init,
 135        .timer = &msm_timer,
 136MACHINE_END
 137