This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

SPI and USB conflict on LCDK

Other Parts Discussed in Thread: OMAPL138, DA8XX, OMAP-L138, PMP

Hi, I add SPI support to LCDK linux kernel, It appears spidev now, but I've got such problem:

If I start linux without usb flash ROM, then there is spidev1.0 in /dev, but is no sda1(my flash ROM).
If I start it with flash ROM than there is no spidev and is sda1.

I'm working with LCDK sdk ver 01.00.00

Here is my changes:

.config
+CONFIG_SPI=y
+CONFIG_SPI_BITBANG=y
+CONFIG_SPI_DAVINCI=y
+CONFIG_SPI_SPIDEV=y

/arch/arm/mach-davinci/da850.c
/* I2C0 function */
MUX_CFG(DA850, I2C0_SDA, 4, 12, 15, 2, false)
MUX_CFG(DA850, I2C0_SCL, 4, 8, 15, 2, false)

/* SPI1 function */
+ MUX_CFG(DA850, SPI1_CLK, 5, 8, 15, 1, true)
+ MUX_CFG(DA850, SPI1_SOMI, 5, 16, 15, 1, true)
+ MUX_CFG(DA850, SPI1_SIMO, 5, 20, 15, 1, true)
+ MUX_CFG(DA850, SPI1_SCS0, 5, 4, 15, 1, true)

/* EMAC function */
MUX_CFG(DA850, MII_TXEN, 2, 4, 15, 8, false)
MUX_CFG(DA850, MII_TXCLK, 2, 8, 15, 8, false)

/* GPIO function */
+ MUX_CFG(DA850, GPIO2_0, 6, 28, 15, 8, true)
+ MUX_CFG(DA850, GPIO3_15, 7, 0, 15, 8, true)

/arch/arm/mach-davinci/include/mach/mux.h
/* I2C0 function */
DA850_I2C0_SDA,
DA850_I2C0_SCL,

/* SPI1 function */
+ DA850_SPI1_CLK,
+ DA850_SPI1_SOMI,
+ DA850_SPI1_SIMO,
+ DA850_SPI1_SCS0,

/* EMAC function */
DA850_MII_TXEN,
DA850_MII_TXCLK,

+ DA850_GPIO2_0,
+ DA850_GPIO3_15,

/arch/arm/mach-davinci/board-omapl138-hawk.c
static const short omapl138_hawk_mcasp_pins[] __initconst = {
    DA850_AHCLKX, DA850_ACLKX, DA850_AFSX,
    DA850_AHCLKR, DA850_ACLKR, DA850_AFSR, DA850_AMUTE,
    DA850_AXR_11, DA850_AXR_12,
    -1
};

+static short da850_spi1_gpio_pins[] __initdata= {
+    DA850_GPIO2_0,DA850_GPIO3_15,
+    -1
+};
+
+static short da8xx_evm_spi_pins[] __initdata = {
+    DA850_SPI1_CLK,DA850_SPI1_SOMI,DA850_SPI1_SIMO,DA850_SPI1_SCS0,
+    -1
+};
+
+static struct spi_board_info da830evm_spi_info[] = {
+{
+    .modalias = "spidev",
+    .mode = SPI_MODE_0,
+    .max_speed_hz = 12000000,
+    .bus_num = 1,
+    .chip_select = 0,
+},
+};

static void omapl138_hawk_sound_init(void){
    int ret;
    ret = davinci_cfg_reg_list(omapl138_hawk_mcasp_pins);
    if (ret)
        pr_warning("omapl138_hawk_init: mcasp mux setup failed: %d\n",
                ret);

    da8xx_register_mcasp(0, &omapl138_hawk_snd_data);

+    printk("da850_spi1_gpio_pins");
+    ret = davinci_cfg_reg_list(da850_spi1_gpio_pins);
+    ret = davinci_cfg_reg_list(da8xx_evm_spi_pins);
+    ret = da8xx_register_spi(1, da830evm_spi_info,ARRAY_SIZE(da830evm_spi_info));
+    if (ret){
+        pr_warning("da830_evm_init: spi 1 registration failed: %d\n",ret);
+        return ret;
+    }
}

Have you got any ideas why is SPI and USB conflict? May it be interrupts?

Thanks

  • Hi Alex,

    There is no chance for USB and SPI conflict since both the peripherals were using different pins,

    Could you please attach your both the bootup logs of linux?

    If I start linux without usb flash ROM

    Sorry I'm not understanding.

    What do you mean the "USB flash ROM"?

    Do you mean pendrive ?

  • I'm sorry, I don't know how it's exactly called in English, maybe USB flash drive?

    I remaid kernel with menuconfig. Just unset and then set USB support again and now there is always /dev/spidev and there is no /dev/sda1 (usb), regardless is usb flash drive inserted or not.

    Here is log with spidev and without insert usb flash drive.

    Uncompressing Linux... done, booting the kernel.
    Linux version 3.1.10 (user@ubuntu) (gcc version 4.5.3 20110311 (prerelease) (GCC) ) #6 PREEMPT Fri Mar 28 06:20:36 PDT 2014
    CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
    CPU: VIVT data cache, VIVT instruction cache
    Machine: AM18x/OMAP-L138 LCDK
    Memory policy: ECC disabled, Data cache writeback
    DaVinci da850/omap-l138/am18x variant 0x1
    Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 8128
    Kernel command line: mem=32M console=ttyS2,115200n8 root=/dev/ram0 rw initrd=0xc1180000,4M ip=dhcp
    PID hash table entries: 128 (order: -3, 512 bytes)
    Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
    Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
    Memory: 32MB = 32MB total
    Memory: 24280k/24280k available, 8488k reserved, 0K highmem
    Virtual kernel memory layout:
        vector  : 0xffff0000 - 0xffff1000   (   4 kB)
        fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
        DMA     : 0xff000000 - 0xffe00000   (  14 MB)
        vmalloc : 0xc2800000 - 0xfea00000   ( 962 MB)
        lowmem  : 0xc0000000 - 0xc2000000   (  32 MB)
        modules : 0xbf000000 - 0xc0000000   (  16 MB)
          .text : 0xc0008000 - 0xc0399440   (3654 kB)
          .init : 0xc039a000 - 0xc03bd000   ( 140 kB)
          .data : 0xc03be000 - 0xc03df340   ( 133 kB)
           .bss : 0xc03df364 - 0xc03f8dfc   ( 103 kB)
    SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
    Preemptible hierarchical RCU implementation.
    NR_IRQS:245
    Console: colour dummy device 80x30
    Calibrating delay loop... 227.32 BogoMIPS (lpj=1136640)
    pid_max: default: 32768 minimum: 301
    Mount-cache hash table entries: 512
    CPU: Testing write buffer coherency: ok
    DaVinci: 144 gpio irqs
    NET: Registered protocol family 16
    EMAC: MII PHY configured
    da850_spi1_gpio_pins
    bio: create slab <bio-0> at 0
    SCSI subsystem initialized
    usbcore: registered new interface driver usbfs
    usbcore: registered new interface driver hub
    usbcore: registered new device driver usb
    Advanced Linux Sound Architecture Driver Version 1.0.24.
    Switching to clocksource timer0_1
    Switched to NOHz mode on CPU #0
    NET: Registered protocol family 2
    IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
    TCP established hash table entries: 1024 (order: 1, 8192 bytes)
    TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
    TCP: Hash tables configured (established 1024 bind 1024)
    TCP reno registered
    UDP hash table entries: 256 (order: 0, 4096 bytes)
    UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
    NET: Registered protocol family 1
    RPC: Registered named UNIX socket transport module.
    RPC: Registered udp transport module.
    RPC: Registered tcp transport module.
    RPC: Registered tcp NFSv4.1 backchannel transport module.
    Trying to unpack rootfs image as initramfs...
    rootfs image is not initramfs (no cpio magic); looks like an initrd
    Freeing initrd memory: 4096K
    msgmni has been set to 55
    io scheduler noop registered (default)
    da8xx_lcdc da8xx_lcdc.0: GLCD: Found VGA_Monitor panel
    Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
    serial8250.0: ttyS0 at MMIO 0x1c42000 (irq = 25) is a 16550A
    serial8250.0: ttyS1 at MMIO 0x1d0c000 (irq = 53) is a 16550A
    serial8250.0: ttyS2 at MMIO 0x1d0d000 (irq = 61) is a 16550A
    console [ttyS2] enabled
    brd: module loaded
    ahci ahci: forcing PORTS_IMPL to 0x1
    ahci ahci: AHCI 0001.0100 32 slots 1 ports 3 Gbps 0x1 impl platform mode
    ahci ahci: flags: ncq sntf pm led clo only pmp pio slum part ccc
    scsi0 : ahci_platform
    ata1: SATA max UDMA/133 mmio [mem 0x01e18000-0x01e19fff] port 0x100 irq 67
    spi_davinci spi_davinci.1: DMA: supported
    spi_davinci spi_davinci.1: DMA: RX channel: 18, TX channel: 19, event queue: 0
    spi_davinci spi_davinci.1: Controller at 0xfef0e000
    davinci_mdio davinci_mdio.0: davinci mdio revision 1.5
    davinci_mdio davinci_mdio.0: detected phy mask ffffff7f
    davinci_mdio.0: probed
    davinci_mdio davinci_mdio.0: phy[7]: device 0:07, driver unknown
    ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
    ohci ohci.0: DA8xx OHCI
    ohci ohci.0: new USB bus registered, assigned bus number 1
    Waiting for USB PHY clock good...
    ohci ohci.0: irq 59, io mem 0x01e25000
    usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
    usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
    usb usb1: Product: DA8xx OHCI
    usb usb1: Manufacturer: Linux 3.1.10 ohci_hcd
    usb usb1: SerialNumber: ohci.0
    hub 1-0:1.0: USB hub found
    hub 1-0:1.0: 1 port detected
    omap_rtc omap_rtc: rtc core: registered omap_rtc as rtc0
    omap_rtc: RTC power up reset detected
    omap_rtc: already running
    i2c /dev entries driver
    davinci_mmc davinci_mmc.0: Using DMA, 4-bit mode
    asoc: tlv320aic3x-hifi <-> davinci-mcasp.0 mapping ok
    ALSA device list:
      #0: DA850/OMAP-L138 EVM
    TCP cubic registered
    NET: Registered protocol family 17
    davinci_emac davinci_emac.1: using random MAC addr: fe:a5:ec:50:b2:55
    console [netcon0] enabled
    netconsole: network logging started
    omap_rtc omap_rtc: setting system clock to 2009-04-14 21:35:14 UTC (1239744914)
    davinci_mdio davinci_mdio.0: resetting idled controller
    net eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=0:07, id=7c0f1)
    ata1: SATA link down (SStatus 0 SControl 300)
    PHY: 0:07 - Link is Up - 100/Full
    Sending DHCP requests ., OK
    IP-Config: Got DHCP answer from 192.168.1.1, my address is 192.168.1.130
    IP-Config: Complete:
         device=eth0, addr=192.168.1.130, mask=255.255.255.0, gw=192.168.1.1,
         host=192.168.1.130, domain=, nis-domain=(none),
         bootserver=192.168.1.1, rootserver=192.168.1.1, rootpath=
    RAMDISK: gzip image found at block 0
    VFS: Mounted root (ext2 filesystem) on device 1:0.
    Freeing init memory: 140K
    INIT: version 2.86 booting
    Starting udevudevd (927): /proc/927/oom_adj is deprecated, please use /proc/927/oom_score_adj instead.
     and populating dev cache
    Remounting root file system...
    root: mount: mounting rootfs on / failed: No such file or directory
    Setting up IP spoofing protection: rp_filter.
    Configuring network interfaces... udhcpc (v1.13.2) started
    Sending discover...
    Sending select for 192.168.1.130...
    Lease of 192.168.1.130 obtained, lease time 86400
    adding dns 192.168.1.1
    done.
    INIT: Entering runlevel: 5
    Starting telnet daemon.
    Starting syslogd/klogd: done


    In log with spidev and insert usb flash drive there is just few new lines:

    ata1: SATA link down (SStatus 0 SControl 300)
    +usb 1-1: new full speed USB device number 2 using ohci
    +usb 1-1: New USB device found, idVendor=0930, idProduct=6544
    +usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    +usb 1-1: Product: DataTraveler 2.0
    +usb 1-1: Manufacturer: Kingston
    +usb 1-1: SerialNumber: 001CC0EC30C8C03026B80677
    PHY: 0:07 - Link is Up - 100/Full

    And here is log on running linux without spi support when I insert usb flash drive:

    usb 1-1: new full-speed USB device number 2 using ohci
    scsi1 : usb-storage 1-1:1.0
    scsi 1:0:0:0: Direct-Access     Kingston DataTraveler 2.0 1.00 PQ: 0 ANSI: 2
    sd 1:0:0:0: Attached scsi generic sg0 type 0
    sd 1:0:0:0: [sda] 3913664 512-byte logical blocks: (2.00 GB/1.86 GiB)
    sd 1:0:0:0: [sda] Write Protect is off
    sd 1:0:0:0: [sda] No Caching mode page present
    sd 1:0:0:0: [sda] Assuming drive cache: write through
    sd 1:0:0:0: [sda] No Caching mode page present
    sd 1:0:0:0: [sda] Assuming drive cache: write through
     sda: sda1
    sd 1:0:0:0: [sda] No Caching mode page present
    sd 1:0:0:0: [sda] Assuming drive cache: write through
    sd 1:0:0:0: [sda] Attached SCSI removable disk

    Thanks

  • Hi Alex,

    Could you please attach your board file which has both the USB and SPI init ?

  • Hi Alex,

    Thanks for sharing the board file,

    Please share appropriate dependency files also such as "da850.c" and mux.h which is SPI1 definitions "DA850_SPI1_CLK" ,

    I can write it own but If i use your files then It is easy to reproduce your issue,

  • here they are

    http://www.sendspace.com/file/lrwjrt

  • Hi Alex,

    Thanks for your files,

    Already coding has been modified myself,

    Please remove the CS signal for SPI1 to test the both USB and SPI1, then i got working both the peripherals (USB & SPI1)

    PFA of the same,

    0513.da850.c
    /*
     * TI DA850/OMAP-L138 chip specific setup
     *
     * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
     *
     * Derived from: arch/arm/mach-davinci/da830.c
     * Original Copyrights follow:
     *
     * 2009 (c) MontaVista Software, Inc. This file is licensed under
     * the terms of the GNU General Public License version 2. This program
     * is licensed "as is" without any warranty of any kind, whether express
     * or implied.
     */
    #include <linux/init.h>
    #include <linux/clk.h>
    #include <linux/platform_device.h>
    #include <linux/cpufreq.h>
    #include <linux/regulator/consumer.h>
    
    #include <asm/mach/map.h>
    
    #include <mach/psc.h>
    #include <mach/irqs.h>
    #include <mach/cputype.h>
    #include <mach/common.h>
    #include <mach/time.h>
    #include <mach/da8xx.h>
    #include <mach/cpufreq.h>
    #include <mach/pm.h>
    #include <mach/gpio.h>
    
    #include "clock.h"
    #include "mux.h"
    
    /* SoC specific clock flags */
    #define DA850_CLK_ASYNC3	BIT(16)
    
    #define DA850_PLL1_BASE		0x01e1a000
    #define DA850_TIMER64P2_BASE	0x01f0c000
    #define DA850_TIMER64P3_BASE	0x01f0d000
    
    #define DA850_REF_FREQ		24000000
    
    #define CFGCHIP3_ASYNC3_CLKSRC	BIT(4)
    #define CFGCHIP3_PLL1_MASTER_LOCK	BIT(5)
    #define CFGCHIP0_PLL_MASTER_LOCK	BIT(4)
    
    static int da850_set_armrate(struct clk *clk, unsigned long rate);
    static int da850_round_armrate(struct clk *clk, unsigned long rate);
    static int da850_set_pll0rate(struct clk *clk, unsigned long armrate);
    
    static struct pll_data pll0_data = {
    	.num		= 1,
    	.phys_base	= DA8XX_PLL0_BASE,
    	.flags		= PLL_HAS_PREDIV | PLL_HAS_POSTDIV,
    };
    
    static struct clk ref_clk = {
    	.name		= "ref_clk",
    	.rate		= DA850_REF_FREQ,
    	.set_rate	= davinci_simple_set_rate,
    };
    
    static struct clk pll0_clk = {
    	.name		= "pll0",
    	.parent		= &ref_clk,
    	.pll_data	= &pll0_data,
    	.flags		= CLK_PLL,
    	.set_rate	= da850_set_pll0rate,
    };
    
    static struct clk pll0_aux_clk = {
    	.name		= "pll0_aux_clk",
    	.parent		= &pll0_clk,
    	.flags		= CLK_PLL | PRE_PLL,
    };
    
    static struct clk pll0_sysclk2 = {
    	.name		= "pll0_sysclk2",
    	.parent		= &pll0_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV2,
    };
    
    static struct clk pll0_sysclk3 = {
    	.name		= "pll0_sysclk3",
    	.parent		= &pll0_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV3,
    	.set_rate	= davinci_set_sysclk_rate,
    	.maxrate	= 100000000,
    };
    
    static struct clk pll0_sysclk4 = {
    	.name		= "pll0_sysclk4",
    	.parent		= &pll0_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV4,
    };
    
    static struct clk pll0_sysclk5 = {
    	.name		= "pll0_sysclk5",
    	.parent		= &pll0_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV5,
    };
    
    static struct clk pll0_sysclk6 = {
    	.name		= "pll0_sysclk6",
    	.parent		= &pll0_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV6,
    };
    
    static struct clk pll0_sysclk7 = {
    	.name		= "pll0_sysclk7",
    	.parent		= &pll0_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV7,
    };
    
    static struct pll_data pll1_data = {
    	.num		= 2,
    	.phys_base	= DA850_PLL1_BASE,
    	.flags		= PLL_HAS_POSTDIV,
    };
    
    static struct clk pll1_clk = {
    	.name		= "pll1",
    	.parent		= &ref_clk,
    	.pll_data	= &pll1_data,
    	.flags		= CLK_PLL,
    };
    
    static struct clk pll1_aux_clk = {
    	.name		= "pll1_aux_clk",
    	.parent		= &pll1_clk,
    	.flags		= CLK_PLL | PRE_PLL,
    };
    
    static struct clk pll1_sysclk2 = {
    	.name		= "pll1_sysclk2",
    	.parent		= &pll1_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV2,
    };
    
    static struct clk pll1_sysclk3 = {
    	.name		= "pll1_sysclk3",
    	.parent		= &pll1_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV3,
    };
    
    static struct clk pll1_sysclk4 = {
    	.name		= "pll1_sysclk4",
    	.parent		= &pll1_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV4,
    };
    
    static struct clk pll1_sysclk5 = {
    	.name		= "pll1_sysclk5",
    	.parent		= &pll1_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV5,
    };
    
    static struct clk pll1_sysclk6 = {
    	.name		= "pll0_sysclk6",
    	.parent		= &pll0_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV6,
    };
    
    static struct clk pll1_sysclk7 = {
    	.name		= "pll1_sysclk7",
    	.parent		= &pll1_clk,
    	.flags		= CLK_PLL,
    	.div_reg	= PLLDIV7,
    };
    
    static struct clk i2c0_clk = {
    	.name		= "i2c0",
    	.parent		= &pll0_aux_clk,
    };
    
    static struct clk timerp64_0_clk = {
    	.name		= "timer0",
    	.parent		= &pll0_aux_clk,
    };
    
    static struct clk timerp64_1_clk = {
    	.name		= "timer1",
    	.parent		= &pll0_aux_clk,
    };
    
    static struct clk arm_rom_clk = {
    	.name		= "arm_rom",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC0_ARM_RAM_ROM,
    	.flags		= ALWAYS_ENABLED,
    };
    
    static struct clk tpcc0_clk = {
    	.name		= "tpcc0",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC0_TPCC,
    	.flags		= ALWAYS_ENABLED | CLK_PSC,
    };
    
    static struct clk tptc0_clk = {
    	.name		= "tptc0",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC0_TPTC0,
    	.flags		= ALWAYS_ENABLED,
    };
    
    static struct clk tptc1_clk = {
    	.name		= "tptc1",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC0_TPTC1,
    	.flags		= ALWAYS_ENABLED,
    };
    
    static struct clk tpcc1_clk = {
    	.name		= "tpcc1",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA850_LPSC1_TPCC1,
    	.gpsc		= 1,
    	.flags		= CLK_PSC | ALWAYS_ENABLED,
    };
    
    static struct clk tptc2_clk = {
    	.name		= "tptc2",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA850_LPSC1_TPTC2,
    	.gpsc		= 1,
    	.flags		= ALWAYS_ENABLED,
    };
    
    static struct clk uart0_clk = {
    	.name		= "uart0",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC0_UART0,
    };
    
    static struct clk uart1_clk = {
    	.name		= "uart1",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC1_UART1,
    	.gpsc		= 1,
    	.flags		= DA850_CLK_ASYNC3,
    };
    
    static struct clk uart2_clk = {
    	.name		= "uart2",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC1_UART2,
    	.gpsc		= 1,
    	.flags		= DA850_CLK_ASYNC3,
    };
    
    static struct clk aintc_clk = {
    	.name		= "aintc",
    	.parent		= &pll0_sysclk4,
    	.lpsc		= DA8XX_LPSC0_AINTC,
    	.flags		= ALWAYS_ENABLED,
    };
    
    static struct clk gpio_clk = {
    	.name		= "gpio",
    	.parent		= &pll0_sysclk4,
    	.lpsc		= DA8XX_LPSC1_GPIO,
    	.gpsc		= 1,
    };
    
    static struct clk i2c1_clk = {
    	.name		= "i2c1",
    	.parent		= &pll0_sysclk4,
    	.lpsc		= DA8XX_LPSC1_I2C,
    	.gpsc		= 1,
    };
    
    static struct clk emif3_clk = {
    	.name		= "emif3",
    	.parent		= &pll0_sysclk5,
    	.lpsc		= DA8XX_LPSC1_EMIF3C,
    	.gpsc		= 1,
    	.flags		= ALWAYS_ENABLED,
    };
    
    static struct clk arm_clk = {
    	.name		= "arm",
    	.parent		= &pll0_sysclk6,
    	.lpsc		= DA8XX_LPSC0_ARM,
    	.flags		= ALWAYS_ENABLED,
    	.set_rate	= da850_set_armrate,
    	.round_rate	= da850_round_armrate,
    };
    
    static struct clk rmii_clk = {
    	.name		= "rmii",
    	.parent		= &pll0_sysclk7,
    };
    
    static struct clk emac_clk = {
    	.name		= "emac",
    	.parent		= &pll0_sysclk4,
    	.lpsc		= DA8XX_LPSC1_CPGMAC,
    	.gpsc		= 1,
    };
    
    static struct clk mcasp_clk = {
    	.name		= "mcasp",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC1_McASP0,
    	.gpsc		= 1,
    	.flags		= DA850_CLK_ASYNC3,
    };
    
    static struct clk lcdc_clk = {
    	.name		= "lcdc",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC1_LCDC,
    	.gpsc		= 1,
    };
    
    static struct clk mmcsd0_clk = {
    	.name		= "mmcsd0",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC0_MMC_SD,
    };
    
    static struct clk mmcsd1_clk = {
    	.name		= "mmcsd1",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA850_LPSC1_MMC_SD1,
    	.gpsc		= 1,
    };
    
    static struct clk aemif_clk = {
    	.name		= "aemif",
    	.parent		= &pll0_sysclk3,
    	.lpsc		= DA8XX_LPSC0_EMIF25,
    	.flags		= ALWAYS_ENABLED,
    };
    
    static struct clk usb11_clk = {
    	.name		= "usb11",
    	.parent		= &pll0_sysclk4,
    	.lpsc		= DA8XX_LPSC1_USB11,
    	.gpsc		= 1,
    };
    
    static struct clk usb20_clk = {
    	.name		= "usb20",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC1_USB20,
    	.gpsc		= 1,
    };
    
    static struct clk spi0_clk = {
    	.name		= "spi0",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC0_SPI0,
    };
    
    static struct clk spi1_clk = {
    	.name		= "spi1",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA8XX_LPSC1_SPI1,
    	.gpsc		= 1,
    	.flags		= DA850_CLK_ASYNC3,
    };
    
    static struct clk sata_clk = {
    	.name		= "sata",
    	.parent		= &pll0_sysclk2,
    	.lpsc		= DA850_LPSC1_SATA,
    	.gpsc		= 1,
    	.flags		= PSC_FORCE,
    };
    
    static struct clk_lookup da850_clks[] = {
    	CLK(NULL,		"ref",		&ref_clk),
    	CLK(NULL,		"pll0",		&pll0_clk),
    	CLK(NULL,		"pll0_aux",	&pll0_aux_clk),
    	CLK(NULL,		"pll0_sysclk2",	&pll0_sysclk2),
    	CLK(NULL,		"pll0_sysclk3",	&pll0_sysclk3),
    	CLK(NULL,		"pll0_sysclk4",	&pll0_sysclk4),
    	CLK(NULL,		"pll0_sysclk5",	&pll0_sysclk5),
    	CLK(NULL,		"pll0_sysclk6",	&pll0_sysclk6),
    	CLK(NULL,		"pll0_sysclk7",	&pll0_sysclk7),
    	CLK(NULL,		"pll1",		&pll1_clk),
    	CLK(NULL,		"pll1_aux",	&pll1_aux_clk),
    	CLK(NULL,		"pll1_sysclk2",	&pll1_sysclk2),
    	CLK(NULL,		"pll1_sysclk3",	&pll1_sysclk3),
    	CLK(NULL,		"pll1_sysclk4",	&pll1_sysclk4),
    	CLK(NULL,		"pll1_sysclk5",	&pll1_sysclk5),
    	CLK(NULL,		"pll1_sysclk6",	&pll1_sysclk6),
    	CLK(NULL,		"pll1_sysclk7",	&pll1_sysclk7),
    	CLK("i2c_davinci.1",	NULL,		&i2c0_clk),
    	CLK(NULL,		"timer0",	&timerp64_0_clk),
    	CLK("watchdog",		NULL,		&timerp64_1_clk),
    	CLK(NULL,		"arm_rom",	&arm_rom_clk),
    	CLK(NULL,		"tpcc0",	&tpcc0_clk),
    	CLK(NULL,		"tptc0",	&tptc0_clk),
    	CLK(NULL,		"tptc1",	&tptc1_clk),
    	CLK(NULL,		"tpcc1",	&tpcc1_clk),
    	CLK(NULL,		"tptc2",	&tptc2_clk),
    	CLK(NULL,		"uart0",	&uart0_clk),
    	CLK(NULL,		"uart1",	&uart1_clk),
    	CLK(NULL,		"uart2",	&uart2_clk),
    	CLK(NULL,		"aintc",	&aintc_clk),
    	CLK(NULL,		"gpio",		&gpio_clk),
    	CLK("i2c_davinci.2",	NULL,		&i2c1_clk),
    	CLK(NULL,		"emif3",	&emif3_clk),
    	CLK(NULL,		"arm",		&arm_clk),
    	CLK(NULL,		"rmii",		&rmii_clk),
    	CLK("davinci_emac.1",	NULL,		&emac_clk),
    	CLK("davinci-mcasp.0",	NULL,		&mcasp_clk),
    	CLK("da8xx_lcdc.0",	NULL,		&lcdc_clk),
    	CLK("davinci_mmc.0",	NULL,		&mmcsd0_clk),
    	CLK("davinci_mmc.1",	NULL,		&mmcsd1_clk),
    	CLK(NULL,		"aemif",	&aemif_clk),
    	CLK(NULL,		"usb11",	&usb11_clk),
    	CLK(NULL,		"usb20",	&usb20_clk),
    	CLK("spi_davinci.0",	NULL,		&spi0_clk),
    	CLK("spi_davinci.1",	NULL,		&spi1_clk),
    	CLK("ahci",		NULL,		&sata_clk),
    	CLK(NULL,		NULL,		NULL),
    };
    
    /*
     * Device specific mux setup
     *
     *		soc	description	mux	mode	mode	mux	dbg
     *					reg	offset	mask	mode
     */
    static const struct mux_config da850_pins[] = {
    #ifdef CONFIG_DAVINCI_MUX
    	/* UART0 function */
    	MUX_CFG(DA850, NUART0_CTS,	3,	24,	15,	2,	false)
    	MUX_CFG(DA850, NUART0_RTS,	3,	28,	15,	2,	false)
    	MUX_CFG(DA850, UART0_RXD,	3,	16,	15,	2,	false)
    	MUX_CFG(DA850, UART0_TXD,	3,	20,	15,	2,	false)
    	/* UART1 function */
    	MUX_CFG(DA850, UART1_RXD,	4,	24,	15,	2,	false)
    	MUX_CFG(DA850, UART1_TXD,	4,	28,	15,	2,	false)
    	/* UART2 function */
    	MUX_CFG(DA850, UART2_RXD,	4,	16,	15,	2,	false)
    	MUX_CFG(DA850, UART2_TXD,	4,	20,	15,	2,	false)
    	/* I2C1 function */
    	MUX_CFG(DA850, I2C1_SCL,	4,	16,	15,	4,	false)
    	MUX_CFG(DA850, I2C1_SDA,	4,	20,	15,	4,	false)
    	/* I2C0 function */
    	MUX_CFG(DA850, I2C0_SDA,	4,	12,	15,	2,	false)
    	MUX_CFG(DA850, I2C0_SCL,	4,	8,	15,	2,	false)
    	/* EMAC function */
    	MUX_CFG(DA850, MII_TXEN,	2,	4,	15,	8,	false)
    	MUX_CFG(DA850, MII_TXCLK,	2,	8,	15,	8,	false)
    	MUX_CFG(DA850, MII_COL,		2,	12,	15,	8,	false)
    	MUX_CFG(DA850, MII_TXD_3,	2,	16,	15,	8,	false)
    	MUX_CFG(DA850, MII_TXD_2,	2,	20,	15,	8,	false)
    	MUX_CFG(DA850, MII_TXD_1,	2,	24,	15,	8,	false)
    	MUX_CFG(DA850, MII_TXD_0,	2,	28,	15,	8,	false)
    	MUX_CFG(DA850, MII_RXCLK,	3,	0,	15,	8,	false)
    	MUX_CFG(DA850, MII_RXDV,	3,	4,	15,	8,	false)
    	MUX_CFG(DA850, MII_RXER,	3,	8,	15,	8,	false)
    	MUX_CFG(DA850, MII_CRS,		3,	12,	15,	8,	false)
    	MUX_CFG(DA850, MII_RXD_3,	3,	16,	15,	8,	false)
    	MUX_CFG(DA850, MII_RXD_2,	3,	20,	15,	8,	false)
    	MUX_CFG(DA850, MII_RXD_1,	3,	24,	15,	8,	false)
    	MUX_CFG(DA850, MII_RXD_0,	3,	28,	15,	8,	false)
    	MUX_CFG(DA850, MDIO_CLK,	4,	0,	15,	8,	false)
    	MUX_CFG(DA850, MDIO_D,		4,	4,	15,	8,	false)
    	MUX_CFG(DA850, RMII_TXD_0,	14,	12,	15,	8,	false)
    	MUX_CFG(DA850, RMII_TXD_1,	14,	8,	15,	8,	false)
    	MUX_CFG(DA850, RMII_TXEN,	14,	16,	15,	8,	false)
    	MUX_CFG(DA850, RMII_CRS_DV,	15,	4,	15,	8,	false)
    	MUX_CFG(DA850, RMII_RXD_0,	14,	24,	15,	8,	false)
    	MUX_CFG(DA850, RMII_RXD_1,	14,	20,	15,	8,	false)
    	MUX_CFG(DA850, RMII_RXER,	14,	28,	15,	8,	false)
    	MUX_CFG(DA850, RMII_MHZ_50_CLK,	15,	0,	15,	0,	false)
    	/* McASP function */
    	MUX_CFG(DA850,	ACLKR,		0,	0,	15,	1,	false)
    	MUX_CFG(DA850,	ACLKX,		0,	4,	15,	1,	false)
    	MUX_CFG(DA850,	AFSR,		0,	8,	15,	1,	false)
    	MUX_CFG(DA850,	AFSX,		0,	12,	15,	1,	false)
    	MUX_CFG(DA850,	AHCLKR,		0,	16,	15,	1,	false)
    	MUX_CFG(DA850,	AHCLKX,		0,	20,	15,	1,	false)
    	MUX_CFG(DA850,	AMUTE,		0,	24,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_15,		1,	0,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_14,		1,	4,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_13,		1,	8,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_12,		1,	12,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_11,		1,	16,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_10,		1,	20,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_9,		1,	24,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_8,		1,	28,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_7,		2,	0,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_6,		2,	4,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_5,		2,	8,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_4,		2,	12,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_3,		2,	16,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_2,		2,	20,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_1,		2,	24,	15,	1,	false)
    	MUX_CFG(DA850,	AXR_0,		2,	28,	15,	1,	false)
    	/* LCD function */
    	MUX_CFG(DA850, LCD_D_7,		16,	8,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_6,		16,	12,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_5,		16,	16,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_4,		16,	20,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_3,		16,	24,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_2,		16,	28,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_1,		17,	0,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_0,		17,	4,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_15,	17,	8,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_14,	17,	12,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_13,	17,	16,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_12,	17,	20,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_11,	17,	24,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_10,	17,	28,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_9,		18,	0,	15,	2,	false)
    	MUX_CFG(DA850, LCD_D_8,		18,	4,	15,	2,	false)
    	MUX_CFG(DA850, LCD_PCLK,	18,	24,	15,	2,	false)
    	MUX_CFG(DA850, LCD_HSYNC,	19,	0,	15,	2,	false)
    	MUX_CFG(DA850, LCD_VSYNC,	19,	4,	15,	2,	false)
    	MUX_CFG(DA850, NLCD_AC_ENB_CS,	19,	24,	15,	2,	false)
    	/* MMC/SD0 function */
    	MUX_CFG(DA850, MMCSD0_DAT_0,	10,	8,	15,	2,	false)
    	MUX_CFG(DA850, MMCSD0_DAT_1,	10,	12,	15,	2,	false)
    	MUX_CFG(DA850, MMCSD0_DAT_2,	10,	16,	15,	2,	false)
    	MUX_CFG(DA850, MMCSD0_DAT_3,	10,	20,	15,	2,	false)
    	MUX_CFG(DA850, MMCSD0_CLK,	10,	0,	15,	2,	false)
    	MUX_CFG(DA850, MMCSD0_CMD,	10,	4,	15,	2,	false)
    	/* EMIF2.5/EMIFA function */
    	MUX_CFG(DA850, EMA_D_7,		9,	0,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_6,		9,	4,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_5,		9,	8,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_4,		9,	12,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_3,		9,	16,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_2,		9,	20,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_1,		9,	24,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_0,		9,	28,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_1,		12,	24,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_2,		12,	20,	15,	1,	false)
    	MUX_CFG(DA850, NEMA_CS_3,	7,	4,	15,	1,	false)
    	MUX_CFG(DA850, NEMA_CS_4,	7,	8,	15,	1,	false)
    	MUX_CFG(DA850, NEMA_WE,		7,	16,	15,	1,	false)
    	MUX_CFG(DA850, NEMA_OE,		7,	20,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_0,		12,	28,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_3,		12,	16,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_4,		12,	12,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_5,		12,	8,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_6,		12,	4,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_7,		12,	0,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_8,		11,	28,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_9,		11,	24,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_10,	11,	20,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_11,	11,	16,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_12,	11,	12,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_13,	11,	8,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_14,	11,	4,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_15,	11,	0,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_16,	10,	28,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_17,	10,	24,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_18,	10,	20,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_19,	10,	16,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_20,	10,	12,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_21,	10,	8,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_22,	10,	4,	15,	1,	false)
    	MUX_CFG(DA850, EMA_A_23,	10,	0,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_8,		8,	28,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_9,		8,	24,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_10,	8,	20,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_11,	8,	16,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_12,	8,	12,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_13,	8,	8,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_14,	8,	4,	15,	1,	false)
    	MUX_CFG(DA850, EMA_D_15,	8,	0,	15,	1,	false)
    	MUX_CFG(DA850, EMA_BA_1,	5,	24,	15,	1,	false)
    	MUX_CFG(DA850, EMA_CLK,		6,	0,	15,	1,	false)
    	MUX_CFG(DA850, EMA_WAIT_1,	6,	24,	15,	1,	false)
    	MUX_CFG(DA850, NEMA_CS_2,	7,	0,	15,	1,	false)
    	/* GPIO function */
    	MUX_CFG(DA850, GPIO2_4,		6,	12,	15,	8,	false)
    	MUX_CFG(DA850, GPIO2_6,		6,	4,	15,	8,	false)
    	MUX_CFG(DA850, GPIO2_8,		5,	28,	15,	8,	false)
    	MUX_CFG(DA850, GPIO2_15,	5,	0,	15,	8,	false)
    	MUX_CFG(DA850, GPIO3_12,	7,	12,	15,	8,	false)
    	MUX_CFG(DA850, GPIO3_13,	7,	8,	15,	8,	false)
    	MUX_CFG(DA850, GPIO4_0,		10,	28,	15,	8,	false)
    	MUX_CFG(DA850, GPIO4_1,		10,	24,	15,	8,	false)
    	MUX_CFG(DA850, GPIO6_13,	13,	8,	15,	8,	false)
    	MUX_CFG(DA850, RTC_ALARM,	0,	28,	15,	2,	false)
    
    #if 0	
    	/* Titus : Debug */
    //	MUX_CFG(DA850, GPIO8_12,	18[pinmux],	20[offset],	15[default],	8[select GPIO fn],	false)
    //	MUX_CFG(DA850, GPIO8_12,	18,	20,	15,	8,	true)
    #endif
    
    #if 1
    
    	/* Titus Debug : SPI interface */
    	MUX_CFG(DA850, SPI1_CLK,	5,	8,	15,	1,	true)
    	MUX_CFG(DA850, SPI1_SOMI,	5,	16,	15,	1,	true)
    	MUX_CFG(DA850, SPI1_SIMO,	5,	20,	15,	1,	true)
    //	MUX_CFG(DA850, SPI1_SCS0,	5,	4,	15,	1,	true)	/* Titus Debug : Need to disable for USB */
    
    #endif
    
    
    #endif
    };
    
    const short da850_i2c0_pins[] __initdata = {
    	DA850_I2C0_SDA, DA850_I2C0_SCL,
    	-1
    };
    
    const short da850_i2c1_pins[] __initdata = {
    	DA850_I2C1_SCL, DA850_I2C1_SDA,
    	-1
    };
    
    const short da850_lcdcntl_pins[] __initdata = {
    	DA850_LCD_D_0, DA850_LCD_D_1, DA850_LCD_D_2, DA850_LCD_D_3,
    	DA850_LCD_D_4, DA850_LCD_D_5, DA850_LCD_D_6, DA850_LCD_D_7,
    	DA850_LCD_D_8, DA850_LCD_D_9, DA850_LCD_D_10, DA850_LCD_D_11,
    	DA850_LCD_D_12, DA850_LCD_D_13, DA850_LCD_D_14, DA850_LCD_D_15,
    	DA850_LCD_PCLK, DA850_LCD_HSYNC, DA850_LCD_VSYNC, DA850_NLCD_AC_ENB_CS,
    	-1
    };
    
    /* FIQ are pri 0-1; otherwise 2-7, with 7 lowest priority */
    static u8 da850_default_priorities[DA850_N_CP_INTC_IRQ] = {
    	[IRQ_DA8XX_COMMTX]		= 7,
    	[IRQ_DA8XX_COMMRX]		= 7,
    	[IRQ_DA8XX_NINT]		= 7,
    	[IRQ_DA8XX_EVTOUT0]		= 7,
    	[IRQ_DA8XX_EVTOUT1]		= 7,
    	[IRQ_DA8XX_EVTOUT2]		= 7,
    	[IRQ_DA8XX_EVTOUT3]		= 7,
    	[IRQ_DA8XX_EVTOUT4]		= 7,
    	[IRQ_DA8XX_EVTOUT5]		= 7,
    	[IRQ_DA8XX_EVTOUT6]		= 7,
    	[IRQ_DA8XX_EVTOUT7]		= 7,
    	[IRQ_DA8XX_CCINT0]		= 7,
    	[IRQ_DA8XX_CCERRINT]		= 7,
    	[IRQ_DA8XX_TCERRINT0]		= 7,
    	[IRQ_DA8XX_AEMIFINT]		= 7,
    	[IRQ_DA8XX_I2CINT0]		= 7,
    	[IRQ_DA8XX_MMCSDINT0]		= 7,
    	[IRQ_DA8XX_MMCSDINT1]		= 7,
    	[IRQ_DA8XX_ALLINT0]		= 7,
    	[IRQ_DA8XX_RTC]			= 7,
    	[IRQ_DA8XX_SPINT0]		= 7,
    	[IRQ_DA8XX_TINT12_0]		= 7,
    	[IRQ_DA8XX_TINT34_0]		= 7,
    	[IRQ_DA8XX_TINT12_1]		= 7,
    	[IRQ_DA8XX_TINT34_1]		= 7,
    	[IRQ_DA8XX_UARTINT0]		= 7,
    	[IRQ_DA8XX_KEYMGRINT]		= 7,
    	[IRQ_DA850_MPUADDRERR0]		= 7,
    	[IRQ_DA8XX_CHIPINT0]		= 7,
    	[IRQ_DA8XX_CHIPINT1]		= 7,
    	[IRQ_DA8XX_CHIPINT2]		= 7,
    	[IRQ_DA8XX_CHIPINT3]		= 7,
    	[IRQ_DA8XX_TCERRINT1]		= 7,
    	[IRQ_DA8XX_C0_RX_THRESH_PULSE]	= 7,
    	[IRQ_DA8XX_C0_RX_PULSE]		= 7,
    	[IRQ_DA8XX_C0_TX_PULSE]		= 7,
    	[IRQ_DA8XX_C0_MISC_PULSE]	= 7,
    	[IRQ_DA8XX_C1_RX_THRESH_PULSE]	= 7,
    	[IRQ_DA8XX_C1_RX_PULSE]		= 7,
    	[IRQ_DA8XX_C1_TX_PULSE]		= 7,
    	[IRQ_DA8XX_C1_MISC_PULSE]	= 7,
    	[IRQ_DA8XX_MEMERR]		= 7,
    	[IRQ_DA8XX_GPIO0]		= 7,
    	[IRQ_DA8XX_GPIO1]		= 7,
    	[IRQ_DA8XX_GPIO2]		= 7,
    	[IRQ_DA8XX_GPIO3]		= 7,
    	[IRQ_DA8XX_GPIO4]		= 7,
    	[IRQ_DA8XX_GPIO5]		= 7,
    	[IRQ_DA8XX_GPIO6]		= 7,
    	[IRQ_DA8XX_GPIO7]		= 7,
    	[IRQ_DA8XX_GPIO8]		= 7,
    	[IRQ_DA8XX_I2CINT1]		= 7,
    	[IRQ_DA8XX_LCDINT]		= 7,
    	[IRQ_DA8XX_UARTINT1]		= 7,
    	[IRQ_DA8XX_MCASPINT]		= 7,
    	[IRQ_DA8XX_ALLINT1]		= 7,
    	[IRQ_DA8XX_SPINT1]		= 7,
    	[IRQ_DA8XX_UHPI_INT1]		= 7,
    	[IRQ_DA8XX_USB_INT]		= 7,
    	[IRQ_DA8XX_IRQN]		= 7,
    	[IRQ_DA8XX_RWAKEUP]		= 7,
    	[IRQ_DA8XX_UARTINT2]		= 7,
    	[IRQ_DA8XX_DFTSSINT]		= 7,
    	[IRQ_DA8XX_EHRPWM0]		= 7,
    	[IRQ_DA8XX_EHRPWM0TZ]		= 7,
    	[IRQ_DA8XX_EHRPWM1]		= 7,
    	[IRQ_DA8XX_EHRPWM1TZ]		= 7,
    	[IRQ_DA850_SATAINT]		= 7,
    	[IRQ_DA850_TINTALL_2]		= 7,
    	[IRQ_DA8XX_ECAP0]		= 7,
    	[IRQ_DA8XX_ECAP1]		= 7,
    	[IRQ_DA8XX_ECAP2]		= 7,
    	[IRQ_DA850_MMCSDINT0_1]		= 7,
    	[IRQ_DA850_MMCSDINT1_1]		= 7,
    	[IRQ_DA850_T12CMPINT0_2]	= 7,
    	[IRQ_DA850_T12CMPINT1_2]	= 7,
    	[IRQ_DA850_T12CMPINT2_2]	= 7,
    	[IRQ_DA850_T12CMPINT3_2]	= 7,
    	[IRQ_DA850_T12CMPINT4_2]	= 7,
    	[IRQ_DA850_T12CMPINT5_2]	= 7,
    	[IRQ_DA850_T12CMPINT6_2]	= 7,
    	[IRQ_DA850_T12CMPINT7_2]	= 7,
    	[IRQ_DA850_T12CMPINT0_3]	= 7,
    	[IRQ_DA850_T12CMPINT1_3]	= 7,
    	[IRQ_DA850_T12CMPINT2_3]	= 7,
    	[IRQ_DA850_T12CMPINT3_3]	= 7,
    	[IRQ_DA850_T12CMPINT4_3]	= 7,
    	[IRQ_DA850_T12CMPINT5_3]	= 7,
    	[IRQ_DA850_T12CMPINT6_3]	= 7,
    	[IRQ_DA850_T12CMPINT7_3]	= 7,
    	[IRQ_DA850_RPIINT]		= 7,
    	[IRQ_DA850_VPIFINT]		= 7,
    	[IRQ_DA850_CCINT1]		= 7,
    	[IRQ_DA850_CCERRINT1]		= 7,
    	[IRQ_DA850_TCERRINT2]		= 7,
    	[IRQ_DA850_TINTALL_3]		= 7,
    	[IRQ_DA850_MCBSP0RINT]		= 7,
    	[IRQ_DA850_MCBSP0XINT]		= 7,
    	[IRQ_DA850_MCBSP1RINT]		= 7,
    	[IRQ_DA850_MCBSP1XINT]		= 7,
    	[IRQ_DA8XX_ARMCLKSTOPREQ]	= 7,
    };
    
    static struct map_desc da850_io_desc[] = {
    	{
    		.virtual	= IO_VIRT,
    		.pfn		= __phys_to_pfn(IO_PHYS),
    		.length		= IO_SIZE,
    		.type		= MT_DEVICE
    	},
    	{
    		.virtual	= DA8XX_CP_INTC_VIRT,
    		.pfn		= __phys_to_pfn(DA8XX_CP_INTC_BASE),
    		.length		= DA8XX_CP_INTC_SIZE,
    		.type		= MT_DEVICE
    	},
    	{
    		.virtual	= SRAM_VIRT,
    		.pfn		= __phys_to_pfn(DA8XX_ARM_RAM_BASE),
    		.length		= SZ_8K,
    		.type		= MT_DEVICE
    	},
    };
    
    static u32 da850_psc_bases[] = { DA8XX_PSC0_BASE, DA8XX_PSC1_BASE };
    
    /* Contents of JTAG ID register used to identify exact cpu type */
    static struct davinci_id da850_ids[] = {
    	{
    		.variant	= 0x0,
    		.part_no	= 0xb7d1,
    		.manufacturer	= 0x017,	/* 0x02f >> 1 */
    		.cpu_id		= DAVINCI_CPU_ID_DA850,
    		.name		= "da850/omap-l138",
    	},
    	{
    		.variant	= 0x1,
    		.part_no	= 0xb7d1,
    		.manufacturer	= 0x017,	/* 0x02f >> 1 */
    		.cpu_id		= DAVINCI_CPU_ID_DA850,
    		.name		= "da850/omap-l138/am18x",
    	},
    };
    
    static struct davinci_timer_instance da850_timer_instance[4] = {
    	{
    		.base		= DA8XX_TIMER64P0_BASE,
    		.bottom_irq	= IRQ_DA8XX_TINT12_0,
    		.top_irq	= IRQ_DA8XX_TINT34_0,
    	},
    	{
    		.base		= DA8XX_TIMER64P1_BASE,
    		.bottom_irq	= IRQ_DA8XX_TINT12_1,
    		.top_irq	= IRQ_DA8XX_TINT34_1,
    	},
    	{
    		.base		= DA850_TIMER64P2_BASE,
    		.bottom_irq	= IRQ_DA850_TINT12_2,
    		.top_irq	= IRQ_DA850_TINT34_2,
    	},
    	{
    		.base		= DA850_TIMER64P3_BASE,
    		.bottom_irq	= IRQ_DA850_TINT12_3,
    		.top_irq	= IRQ_DA850_TINT34_3,
    	},
    };
    
    /*
     * T0_BOT: Timer 0, bottom		: Used for clock_event
     * T0_TOP: Timer 0, top			: Used for clocksource
     * T1_BOT, T1_TOP: Timer 1, bottom & top: Used for watchdog timer
     */
    static struct davinci_timer_info da850_timer_info = {
    	.timers		= da850_timer_instance,
    	.clockevent_id	= T0_BOT,
    	.clocksource_id	= T0_TOP,
    };
    
    static void da850_set_async3_src(int pllnum)
    {
    	struct clk *clk, *newparent = pllnum ? &pll1_sysclk2 : &pll0_sysclk2;
    	struct clk_lookup *c;
    	unsigned int v;
    	int ret;
    
    	for (c = da850_clks; c->clk; c++) {
    		clk = c->clk;
    		if (clk->flags & DA850_CLK_ASYNC3) {
    			ret = clk_set_parent(clk, newparent);
    			WARN(ret, "DA850: unable to re-parent clock %s",
    								clk->name);
    		}
           }
    
    	v = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
    	if (pllnum)
    		v |= CFGCHIP3_ASYNC3_CLKSRC;
    	else
    		v &= ~CFGCHIP3_ASYNC3_CLKSRC;
    	__raw_writel(v, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
    }
    
    #ifdef CONFIG_CPU_FREQ
    /*
     * Notes:
     * According to the TRM, minimum PLLM results in maximum power savings.
     * The OPP definitions below should keep the PLLM as low as possible.
     *
     * The output of the PLLM must be between 300 to 600 MHz.
     */
    struct da850_opp {
    	unsigned int	freq;	/* in KHz */
    	unsigned int	prediv;
    	unsigned int	mult;
    	unsigned int	postdiv;
    	unsigned int	cvdd_min; /* in uV */
    	unsigned int	cvdd_max; /* in uV */
    };
    
    static const struct da850_opp da850_opp_456 = {
    	.freq		= 456000,
    	.prediv		= 1,
    	.mult		= 19,
    	.postdiv	= 1,
    	.cvdd_min	= 1300000,
    	.cvdd_max	= 1350000,
    };
    
    static const struct da850_opp da850_opp_408 = {
    	.freq		= 408000,
    	.prediv		= 1,
    	.mult		= 17,
    	.postdiv	= 1,
    	.cvdd_min	= 1300000,
    	.cvdd_max	= 1350000,
    };
    
    static const struct da850_opp da850_opp_372 = {
    	.freq		= 372000,
    	.prediv		= 2,
    	.mult		= 31,
    	.postdiv	= 1,
    	.cvdd_min	= 1200000,
    	.cvdd_max	= 1320000,
    };
    
    static const struct da850_opp da850_opp_300 = {
    	.freq		= 300000,
    	.prediv		= 1,
    	.mult		= 25,
    	.postdiv	= 2,
    	.cvdd_min	= 1200000,
    	.cvdd_max	= 1320000,
    };
    
    static const struct da850_opp da850_opp_200 = {
    	.freq		= 200000,
    	.prediv		= 1,
    	.mult		= 25,
    	.postdiv	= 3,
    	.cvdd_min	= 1100000,
    	.cvdd_max	= 1160000,
    };
    
    static const struct da850_opp da850_opp_96 = {
    	.freq		= 96000,
    	.prediv		= 1,
    	.mult		= 20,
    	.postdiv	= 5,
    	.cvdd_min	= 1000000,
    	.cvdd_max	= 1050000,
    };
    
    #define OPP(freq) 		\
    	{				\
    		.index = (unsigned int) &da850_opp_##freq,	\
    		.frequency = freq * 1000, \
    	}
    
    static struct cpufreq_frequency_table da850_freq_table[] = {
    	OPP(456),
    	OPP(408),
    	OPP(372),
    	OPP(300),
    	OPP(200),
    	OPP(96),
    	{
    		.index		= 0,
    		.frequency	= CPUFREQ_TABLE_END,
    	},
    };
    
    #ifdef CONFIG_REGULATOR
    static int da850_set_voltage(unsigned int index);
    static int da850_regulator_init(void);
    #endif
    
    static struct davinci_cpufreq_config cpufreq_info = {
    	.freq_table = da850_freq_table,
    #ifdef CONFIG_REGULATOR
    	.init = da850_regulator_init,
    	.set_voltage = da850_set_voltage,
    #endif
    };
    
    #ifdef CONFIG_REGULATOR
    static struct regulator *cvdd;
    
    static int da850_set_voltage(unsigned int index)
    {
    	struct da850_opp *opp;
    
    	if (!cvdd)
    		return -ENODEV;
    
    	opp = (struct da850_opp *) cpufreq_info.freq_table[index].index;
    
    	return regulator_set_voltage(cvdd, opp->cvdd_min, opp->cvdd_max);
    }
    
    static int da850_regulator_init(void)
    {
    	cvdd = regulator_get(NULL, "cvdd");
    	if (WARN(IS_ERR(cvdd), "Unable to obtain voltage regulator for CVDD;"
    					" voltage scaling unsupported\n")) {
    		return PTR_ERR(cvdd);
    	}
    
    	return 0;
    }
    #endif
    
    static struct platform_device da850_cpufreq_device = {
    	.name			= "cpufreq-davinci",
    	.dev = {
    		.platform_data	= &cpufreq_info,
    	},
    	.id = -1,
    };
    
    unsigned int da850_max_speed = 300000;
    
    int __init da850_register_cpufreq(char *async_clk)
    {
    	int i;
    
    	/* cpufreq driver can help keep an "async" clock constant */
    	if (async_clk)
    		clk_add_alias("async", da850_cpufreq_device.name,
    							async_clk, NULL);
    	for (i = 0; i < ARRAY_SIZE(da850_freq_table); i++) {
    		if (da850_freq_table[i].frequency <= da850_max_speed) {
    			cpufreq_info.freq_table = &da850_freq_table[i];
    			break;
    		}
    	}
    
    	return platform_device_register(&da850_cpufreq_device);
    }
    
    static int da850_round_armrate(struct clk *clk, unsigned long rate)
    {
    	int i, ret = 0, diff;
    	unsigned int best = (unsigned int) -1;
    	struct cpufreq_frequency_table *table = cpufreq_info.freq_table;
    
    	rate /= 1000; /* convert to kHz */
    
    	for (i = 0; table[i].frequency != CPUFREQ_TABLE_END; i++) {
    		diff = table[i].frequency - rate;
    		if (diff < 0)
    			diff = -diff;
    
    		if (diff < best) {
    			best = diff;
    			ret = table[i].frequency;
    		}
    	}
    
    	return ret * 1000;
    }
    
    static int da850_set_armrate(struct clk *clk, unsigned long index)
    {
    	struct clk *pllclk = &pll0_clk;
    
    	return clk_set_rate(pllclk, index);
    }
    
    static int da850_set_pll0rate(struct clk *clk, unsigned long index)
    {
    	unsigned int prediv, mult, postdiv;
    	struct da850_opp *opp;
    	struct pll_data *pll = clk->pll_data;
    	int ret;
    
    	opp = (struct da850_opp *) cpufreq_info.freq_table[index].index;
    	prediv = opp->prediv;
    	mult = opp->mult;
    	postdiv = opp->postdiv;
    
    	ret = davinci_set_pllrate(pll, prediv, mult, postdiv);
    	if (WARN_ON(ret))
    		return ret;
    
    	return 0;
    }
    #else
    int __init da850_register_cpufreq(char *async_clk)
    {
    	return 0;
    }
    
    static int da850_set_armrate(struct clk *clk, unsigned long rate)
    {
    	return -EINVAL;
    }
    
    static int da850_set_pll0rate(struct clk *clk, unsigned long armrate)
    {
    	return -EINVAL;
    }
    
    static int da850_round_armrate(struct clk *clk, unsigned long rate)
    {
    	return clk->rate;
    }
    #endif
    
    int da850_register_pm(struct platform_device *pdev)
    {
    	int ret;
    	struct davinci_pm_config *pdata = pdev->dev.platform_data;
    
    	ret = davinci_cfg_reg(DA850_RTC_ALARM);
    	if (ret)
    		return ret;
    
    	pdata->ddr2_ctlr_base = da8xx_get_mem_ctlr();
    	pdata->deepsleep_reg = DA8XX_SYSCFG1_VIRT(DA8XX_DEEPSLEEP_REG);
    	pdata->ddrpsc_num = DA8XX_LPSC1_EMIF3C;
    
    	pdata->cpupll_reg_base = ioremap(DA8XX_PLL0_BASE, SZ_4K);
    	if (!pdata->cpupll_reg_base)
    		return -ENOMEM;
    
    	pdata->ddrpll_reg_base = ioremap(DA850_PLL1_BASE, SZ_4K);
    	if (!pdata->ddrpll_reg_base) {
    		ret = -ENOMEM;
    		goto no_ddrpll_mem;
    	}
    
    	pdata->ddrpsc_reg_base = ioremap(DA8XX_PSC1_BASE, SZ_4K);
    	if (!pdata->ddrpsc_reg_base) {
    		ret = -ENOMEM;
    		goto no_ddrpsc_mem;
    	}
    
    	return platform_device_register(pdev);
    
    no_ddrpsc_mem:
    	iounmap(pdata->ddrpll_reg_base);
    no_ddrpll_mem:
    	iounmap(pdata->cpupll_reg_base);
    	return ret;
    }
    
    static struct davinci_soc_info davinci_soc_info_da850 = {
    	.io_desc		= da850_io_desc,
    	.io_desc_num		= ARRAY_SIZE(da850_io_desc),
    	.jtag_id_reg		= DA8XX_SYSCFG0_BASE + DA8XX_JTAG_ID_REG,
    	.ids			= da850_ids,
    	.ids_num		= ARRAY_SIZE(da850_ids),
    	.cpu_clks		= da850_clks,
    	.psc_bases		= da850_psc_bases,
    	.psc_bases_num		= ARRAY_SIZE(da850_psc_bases),
    	.pinmux_base		= DA8XX_SYSCFG0_BASE + 0x120,
    	.pinmux_pins		= da850_pins,
    	.pinmux_pins_num	= ARRAY_SIZE(da850_pins),
    	.intc_base		= DA8XX_CP_INTC_BASE,
    	.intc_type		= DAVINCI_INTC_TYPE_CP_INTC,
    	.intc_irq_prios		= da850_default_priorities,
    	.intc_irq_num		= DA850_N_CP_INTC_IRQ,
    	.timer_info		= &da850_timer_info,
    	.gpio_type		= GPIO_TYPE_DAVINCI,
    	.gpio_base		= DA8XX_GPIO_BASE,
    	.gpio_num		= 144,
    	.gpio_irq		= IRQ_DA8XX_GPIO0,
    	.serial_dev		= &da8xx_serial_device,
    	.emac_pdata		= &da8xx_emac_pdata,
    	.sram_dma		= DA8XX_ARM_RAM_BASE,
    	.sram_len		= SZ_8K,
    	.reset_device		= &da8xx_wdt_device,
    };
    
    void __init da850_init(void)
    {
    	unsigned int v;
    
    	davinci_common_init(&davinci_soc_info_da850);
    
    	da8xx_syscfg0_base = ioremap(DA8XX_SYSCFG0_BASE, SZ_4K);
    	if (WARN(!da8xx_syscfg0_base, "Unable to map syscfg0 module"))
    		return;
    
    	da8xx_syscfg1_base = ioremap(DA8XX_SYSCFG1_BASE, SZ_4K);
    	if (WARN(!da8xx_syscfg1_base, "Unable to map syscfg1 module"))
    		return;
    
    	/*
    	 * Move the clock source of Async3 domain to PLL1 SYSCLK2.
    	 * This helps keeping the peripherals on this domain insulated
    	 * from CPU frequency changes caused by DVFS. The firmware sets
    	 * both PLL0 and PLL1 to the same frequency so, there should not
    	 * be any noticeable change even in non-DVFS use cases.
    	 */
    	da850_set_async3_src(1);
    
    	/* Unlock writing to PLL0 registers */
    	v = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP0_REG));
    	v &= ~CFGCHIP0_PLL_MASTER_LOCK;
    	__raw_writel(v, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP0_REG));
    
    	/* Unlock writing to PLL1 registers */
    	v = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
    	v &= ~CFGCHIP3_PLL1_MASTER_LOCK;
    	__raw_writel(v, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
    }
    

    6813.board-omapl138-hawk.c
    /*
     * Hawkboard.org based on TI's OMAP-L138 Platform
     *
     * Initial code: Syed Mohammed Khasim
     * Additional code derived from: arch/arm/mach-davinci/board-da850-evm.c
     *
     * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com
     *
     * This file is licensed under the terms of the GNU General Public License
     * version 2. This program is licensed "as is" without any warranty of
     * any kind, whether express or implied.
     */
    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/console.h>
    #include <linux/gpio.h>
    #include <linux/i2c.h>
    #include <linux/spi/spi.h>
    #include <linux/spi/flash.h>
    
    #include <asm/mach-types.h>
    #include <asm/mach/arch.h>
    
    #include <mach/cp_intc.h>
    #include <mach/da8xx.h>
    #include <mach/mux.h>
    #include <mach/spi.h>
    
    #define HAWKBOARD_PHY_ID		"0:07"
    #define DA850_LCD_PWR_PIN		GPIO_TO_PIN(2, 8)
    #define DA850_LCD_BL_PIN		GPIO_TO_PIN(2, 15)
    
    #ifdef  CONFIG_HAWKBOARD_LCDK
    #define DA850_HAWK_MMCSD_CD_PIN		GPIO_TO_PIN(4, 0)
    #else
    #define DA850_HAWK_MMCSD_CD_PIN		GPIO_TO_PIN(3, 12)
    #endif
    
    #define DA850_HAWK_MMCSD_WP_PIN		GPIO_TO_PIN(3, 13)
    #define DA850_HAWK_USER_LED0		GPIO_TO_PIN(6, 12)
    #define DA850_HAWK_USER_LED1		GPIO_TO_PIN(6, 13)
    #define DA850_USB1_VBUS_PIN		GPIO_TO_PIN(2, 4)
    #define DA850_USB1_OC_PIN		GPIO_TO_PIN(6, 13)
    
    #define HAWKBOARD_SATA_REFCLKPN_RATE	(100 * 1000 * 1000)
    
    static short omapl138_hawk_mii_pins[] __initdata = {
    	DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
    	DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
    	DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
    	DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
    	DA850_MDIO_D,
    	-1
    };
    
    static __init void omapl138_hawk_config_emac(void)
    {
    	void __iomem *cfgchip3 = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);
    	int ret;
    	u32 val;
    	struct davinci_soc_info *soc_info = &davinci_soc_info;
    
    	val = __raw_readl(cfgchip3);
    	val &= ~BIT(8);
    	ret = davinci_cfg_reg_list(omapl138_hawk_mii_pins);
    	if (ret) {
    		pr_warning("%s: cpgmac/mii mux setup failed: %d\n",
    			__func__, ret);
    		return;
    	}
    
    	/* configure the CFGCHIP3 register for MII */
    	__raw_writel(val, cfgchip3);
    	pr_info("EMAC: MII PHY configured\n");
    
    	soc_info->emac_pdata->phy_id = HAWKBOARD_PHY_ID;
    
    	ret = da8xx_register_emac();
    	if (ret)
    		pr_warning("%s: emac registration failed: %d\n",
    			__func__, ret);
    }
    
    /*
     * The following EDMA channels/slots are not being used by drivers (for
     * example: Timer, GPIO, UART events etc) on da850/omap-l138 EVM/Hawkboard,
     * hence they are being reserved for codecs on the DSP side.
     */
    static const s16 da850_dma0_rsv_chans[][2] = {
    	/* (offset, number) */
    	{ 8,  6},
    	{24,  4},
    	{30,  2},
    	{-1, -1}
    };
    
    static const s16 da850_dma0_rsv_slots[][2] = {
    	/* (offset, number) */
    	{ 8,  6},
    	{24,  4},
    	{30, 50},
    	{-1, -1}
    };
    
    static const s16 da850_dma1_rsv_chans[][2] = {
    	/* (offset, number) */
    	{ 0, 28},
    	{30,  2},
    	{-1, -1}
    };
    
    static const s16 da850_dma1_rsv_slots[][2] = {
    	/* (offset, number) */
    	{ 0, 28},
    	{30, 90},
    	{-1, -1}
    };
    
    static struct edma_rsv_info da850_edma_cc0_rsv = {
    	.rsv_chans	= da850_dma0_rsv_chans,
    	.rsv_slots	= da850_dma0_rsv_slots,
    };
    
    static struct edma_rsv_info da850_edma_cc1_rsv = {
    	.rsv_chans	= da850_dma1_rsv_chans,
    	.rsv_slots	= da850_dma1_rsv_slots,
    };
    
    static struct edma_rsv_info *da850_edma_rsv[2] = {
    	&da850_edma_cc0_rsv,
    	&da850_edma_cc1_rsv,
    };
    
    static const short hawk_mmcsd0_pins[] = {
    	DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2,
    	DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD,
    	DA850_GPIO3_12, DA850_GPIO3_13,
    	-1
    };
    
    static int da850_hawk_mmc_get_ro(int index)
    {
    #ifdef CONFIG_HAWKBOARD_LCDK
    	return 0;
    #else
    	return gpio_get_value(DA850_HAWK_MMCSD_WP_PIN);
    #endif
    }
    
    static int da850_hawk_mmc_get_cd(int index)
    {
    	return !gpio_get_value(DA850_HAWK_MMCSD_CD_PIN);
    }
    
    static struct davinci_mmc_config da850_mmc_config = {
    	.get_ro		= da850_hawk_mmc_get_ro,
    	.get_cd		= da850_hawk_mmc_get_cd,
    	.wires		= 4,
    	.max_freq	= 50000000,
    	.caps		= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
    	.version	= MMC_CTLR_VERSION_2,
    };
    
    static __init void omapl138_hawk_mmc_init(void)
    {
    	int ret;
    
    	ret = davinci_cfg_reg_list(hawk_mmcsd0_pins);
    	if (ret) {
    		pr_warning("%s: MMC/SD0 mux setup failed: %d\n",
    			__func__, ret);
    		return;
    	}
    
    	ret = gpio_request_one(DA850_HAWK_MMCSD_CD_PIN,
    			GPIOF_DIR_IN, "MMC CD");
    	if (ret < 0) {
    		pr_warning("%s: can not open GPIO %d\n",
    			__func__, DA850_HAWK_MMCSD_CD_PIN);
    		return;
    	}
    
    	ret = gpio_request_one(DA850_HAWK_MMCSD_WP_PIN,
    			GPIOF_DIR_IN, "MMC WP");
    	if (ret < 0) {
    		pr_warning("%s: can not open GPIO %d\n",
    			__func__, DA850_HAWK_MMCSD_WP_PIN);
    		goto mmc_setup_wp_fail;
    	}
    
    	ret = da8xx_register_mmcsd0(&da850_mmc_config);
    	if (ret) {
    		pr_warning("%s: MMC/SD0 registration failed: %d\n",
    			__func__, ret);
    		goto mmc_setup_mmcsd_fail;
    	}
    
    	return;
    
    mmc_setup_mmcsd_fail:
    	gpio_free(DA850_HAWK_MMCSD_WP_PIN);
    mmc_setup_wp_fail:
    	gpio_free(DA850_HAWK_MMCSD_CD_PIN);
    }
    
    static irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id);
    static da8xx_ocic_handler_t hawk_usb_ocic_handler;
    
    static const short da850_hawk_usb11_pins[] = {
    	DA850_GPIO2_4, DA850_GPIO6_13,
    	-1
    };
    
    static int hawk_usb_set_power(unsigned port, int on)
    {
    	gpio_set_value(DA850_USB1_VBUS_PIN, on);
    	return 0;
    }
    
    static int hawk_usb_get_power(unsigned port)
    {
    	return gpio_get_value(DA850_USB1_VBUS_PIN);
    }
    
    static int hawk_usb_get_oci(unsigned port)
    {
    	return !gpio_get_value(DA850_USB1_OC_PIN);
    }
    
    static int hawk_usb_ocic_notify(da8xx_ocic_handler_t handler)
    {
    	int irq         = gpio_to_irq(DA850_USB1_OC_PIN);
    	int error       = 0;
    
    	if (handler != NULL) {
    		hawk_usb_ocic_handler = handler;
    
    		error = request_irq(irq, omapl138_hawk_usb_ocic_irq,
    					IRQF_DISABLED | IRQF_TRIGGER_RISING |
    					IRQF_TRIGGER_FALLING,
    					"OHCI over-current indicator", NULL);
    		if (error)
    			pr_err("%s: could not request IRQ to watch "
    				"over-current indicator changes\n", __func__);
    	} else {
    		free_irq(irq, NULL);
    	}
    	return error;
    }
    
    static struct da8xx_ohci_root_hub omapl138_hawk_usb11_pdata = {
    	.set_power      = hawk_usb_set_power,
    	.get_power      = hawk_usb_get_power,
    	.get_oci        = hawk_usb_get_oci,
    	.ocic_notify    = hawk_usb_ocic_notify,
    	/* TPS2087 switch @ 5V */
    	.potpgt         = (3 + 1) / 2,  /* 3 ms max */
    };
    
    static irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id)
    {
    	hawk_usb_ocic_handler(&omapl138_hawk_usb11_pdata, 1);
    	return IRQ_HANDLED;
    }
    
    static __init void omapl138_hawk_usb_init(void)
    {
    	int ret;
    	u32 cfgchip2;
    
    	ret = davinci_cfg_reg_list(da850_hawk_usb11_pins);
    	if (ret) {
    		pr_warning("%s: USB 1.1 PinMux setup failed: %d\n",
    			__func__, ret);
    		return;
    	}
    
    	/* Setup the Ref. clock frequency for the HAWK at 24 MHz. */
    
    	cfgchip2 = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
    	cfgchip2 &= ~CFGCHIP2_REFFREQ;
    	cfgchip2 |=  CFGCHIP2_REFFREQ_24MHZ;
    	__raw_writel(cfgchip2, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
    
    	ret = gpio_request_one(DA850_USB1_VBUS_PIN,
    			GPIOF_DIR_OUT, "USB1 VBUS");
    	if (ret < 0) {
    		pr_err("%s: failed to request GPIO for USB 1.1 port "
    			"power control: %d\n", __func__, ret);
    		return;
    	}
    
    	ret = gpio_request_one(DA850_USB1_OC_PIN,
    			GPIOF_DIR_IN, "USB1 OC");
    	if (ret < 0) {
    		pr_err("%s: failed to request GPIO for USB 1.1 port "
    			"over-current indicator: %d\n", __func__, ret);
    		goto usb11_setup_oc_fail;
    	}
    
    	ret = da8xx_register_usb11(&omapl138_hawk_usb11_pdata);
    	if (ret) {
    		pr_warning("%s: USB 1.1 registration failed: %d\n",
    			__func__, ret);
    		goto usb11_setup_fail;
    	}
    
    	return;
    
    usb11_setup_fail:
    	gpio_free(DA850_USB1_OC_PIN);
    usb11_setup_oc_fail:
    	gpio_free(DA850_USB1_VBUS_PIN);
    }
    
    static struct davinci_uart_config omapl138_hawk_uart_config __initdata = {
    	.enabled_uarts = 0x7,
    };
    
    #ifdef CONFIG_CPU_FREQ
    static __init int omapl138_lcdk_init_cpufreq(void)
    {
    	switch (system_rev & 0xF) {
    	case 3:
    		da850_max_speed = 456000;
    		break;
    	case 2:
    		da850_max_speed = 408000;
    		break;
    	case 1:
    		da850_max_speed = 372000;
    		break;
    	}
    
    	return da850_register_cpufreq("pll0_sysclk3");
    }
    #else
    static __init int omapl138_lcdk_init_cpufreq(void) { return 0; }
    #endif
    
    /* I2C */
    static struct i2c_board_info __initdata omapl138_hawk_i2c_devices[] = {
    	{
    		I2C_BOARD_INFO("tlv320aic3x", 0x18),
    	},
    };
    
    static struct davinci_i2c_platform_data omapl138_hawk_i2c_0_pdata = {
    	.bus_freq	= 100,	/* kHz */
    	.bus_delay	= 0,	/* usec */
    };
    
    static void omapl138_hawk_i2c_init(void)
    	{
    	int ret;
    	ret = davinci_cfg_reg_list(da850_i2c0_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: i2c0 mux setup failed: %d\n",
    				ret);
    
    	ret = da8xx_register_i2c(0, &omapl138_hawk_i2c_0_pdata);
    	if (ret)
    		pr_warning("omapl138_hawk_init: i2c0 registration failed: %d\n",
    				ret);
    	i2c_register_board_info(1, omapl138_hawk_i2c_devices,
    			ARRAY_SIZE(omapl138_hawk_i2c_devices));
    }
    
    /* VGA */
    static const short omapl138_hawk_lcdc_pins[] = {
    	DA850_GPIO2_8, DA850_GPIO2_15,
     	-1
    };
    
    /* Backlight and power is for use with LCD expansion header only */
    static void da850_panel_power_ctrl(int val)
    {
    	/* lcd backlight */
    	gpio_set_value(DA850_LCD_BL_PIN, val);
    	/* lcd power */
    	gpio_set_value(DA850_LCD_PWR_PIN, val);
    }
    
    static int da850_lcd_hw_init(void)
    {
    	int status;
    
    	status = gpio_request(DA850_LCD_BL_PIN, "lcd bl\n");
    	if (status < 0)
    		return status;
    
    	status = gpio_request(DA850_LCD_PWR_PIN, "lcd pwr\n");
    	if (status < 0) {
    		gpio_free(DA850_LCD_BL_PIN);
    		return status;
    	}
    
    	gpio_direction_output(DA850_LCD_BL_PIN, 0);
    	gpio_direction_output(DA850_LCD_PWR_PIN, 0);
    
    	/* Switch off panel power and backlight */
    	da850_panel_power_ctrl(0);
    
    	/* Switch on panel power and backlight */
    	da850_panel_power_ctrl(1);
    
    	return 0;
    }
    
    static void omapl138_hawk_display_init(void)
    {
    	int ret;
    
    	ret = davinci_cfg_reg_list(da850_lcdcntl_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: lcdcntl mux setup failed: %d\n",
    				ret);
    	
    	ret = davinci_cfg_reg_list(omapl138_hawk_lcdc_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: evm specific lcd mux setup "
    				"failed: %d\n",	ret);
    
    	da850_lcd_hw_init();
    
    	ret = da8xx_register_lcdc(&vga_monitor_pdata);
    	if (ret)
    		pr_warning("omapl138_hawk_init: lcdc registration failed: %d\n",
    				ret);
    }
    
    /* Set up OMAP-L138 Hawkboard/ LCDK low-level McASP driver */
    static u8 da850_iis_serializer_direction[] = {
    	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
    	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
    	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
    	INACTIVE_MODE,	TX_MODE,	RX_MODE,	INACTIVE_MODE,
    };
    
    static struct snd_platform_data omapl138_hawk_snd_data = {
    	.tx_dma_offset	= 0x2000,
    	.rx_dma_offset	= 0x2000,
    	.op_mode	= DAVINCI_MCASP_IIS_MODE,
    	.num_serializer	= ARRAY_SIZE(da850_iis_serializer_direction),
    	.tdm_slots	= 2,
    	.serial_dir	= da850_iis_serializer_direction,
    	.asp_chan_q	= EVENTQ_0,
    	.version	= MCASP_VERSION_2,
    	.txnumevt	= 1,
    	.rxnumevt	= 1,
    };
    
    static const short omapl138_hawk_mcasp_pins[] __initconst = {
    	DA850_AHCLKX, DA850_ACLKX, DA850_AFSX,
    	DA850_AHCLKR, DA850_ACLKR, DA850_AFSR, DA850_AMUTE,
    	DA850_AXR_11, DA850_AXR_12,
    	-1
    };
    
    	/*-------NEW_FOR_SPI-----------*/
    //static short da850_spi1_gpio_pins[] __initdata= {
    //	DA850_GPIO2_0,DA850_GPIO3_15,
    //	-1
    //};
    
    static short da8xx_evm_spi_pins[] __initdata = {
    	DA850_SPI1_CLK,DA850_SPI1_SOMI,DA850_SPI1_SIMO,
    	-1
    };
    
    /*static struct spi_platform_data spi1_pd = {
    	.irq_gpio    = GPIO_TO_PIN(2, 0),
    	.reset_gpio  = GPIO_TO_PIN(3, 15),
    };*/
    
    static struct spi_board_info da850evm_spi_info[] = {
    {
    	.modalias = "spidev",
    	/*.platform_data = &spi1_pd,*/
    	.mode = SPI_MODE_0,
    	.max_speed_hz = 12000000,
    	.bus_num = 1,
    //	.chip_select = 0,
    },
    };
    
    static void omapl138_hawk_sound_init(void)
    {
    	int ret;
    	ret = davinci_cfg_reg_list(omapl138_hawk_mcasp_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: mcasp mux setup failed: %d\n",
    				ret);
    
    	da8xx_register_mcasp(0, &omapl138_hawk_snd_data);
    }
    
    static __init void omapl138_hawk_init(void)
    {
    	int ret;
    
    	davinci_serial_init(&omapl138_hawk_uart_config);
    	/*
    	 * shut down uart 0 and 1; they are not used on this board and
    	 * accessing them causes endless "too much work in irq53" messages
    	 * with arago fs
    	 */
    	__raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
    	__raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
    
    	omapl138_hawk_config_emac();
    
    	ret = da850_register_edma(da850_edma_rsv);
    	if (ret)
    		pr_warning("%s: EDMA registration failed: %d\n",
    			__func__, ret);
    
    	omapl138_hawk_mmc_init();
    
    	omapl138_hawk_usb_init();
    
    	ret = da8xx_register_watchdog();
    	if (ret)
    		pr_warning("omapl138_hawk_init: "
    			"watchdog registration failed: %d\n",
    			ret);
    
    	ret = da8xx_register_rtc();
    	if (ret)
    		pr_warning("omapl138_hawk_init: rtc setup failed: %d\n", ret);
    
    	ret = omapl138_lcdk_init_cpufreq();
    	if (ret)
    		pr_warning("omapl138_hawk_init: cpufreq registration failed: %d\n",
    				ret);
    
    	ret = da8xx_register_cpuidle();
    	if (ret)
    		pr_warning("omapl138_hawk_init: cpuidle registration failed: %d\n",
    				ret);
    
    	omapl138_hawk_i2c_init();
    	omapl138_hawk_display_init();
    	omapl138_hawk_sound_init();
    
    	ret = da850_register_sata(HAWKBOARD_SATA_REFCLKPN_RATE);
    	if (ret)
    		pr_warning("omapl138_lcdk_init: sata registration failed: %d\n",
    				ret);
    
    	/*-------NEW_FOR_SPI-----------*/
    #if 1
    
    	printk("#### SPI DEBUG : da850_spi1_gpio_pins\n");
    //	ret = davinci_cfg_reg_list(da850_spi1_gpio_pins);
    	ret = davinci_cfg_reg_list(da8xx_evm_spi_pins);
    	printk("#### SPI DEBUG : SPI pinmux done ret = %d\n",ret);
    	ret = da8xx_register_spi(1, da850evm_spi_info,ARRAY_SIZE(da850evm_spi_info));
    
    	if (ret){
    		pr_warning("#### SPI DEBUG : da850_evm_init: SPI1 registration failed: %d\n",ret);
    		}
    	else
    		{
    		printk("#### SPI DEBUG : da850_evm_init: SPI1 registration success: %d\n",ret);		
    		}
    #endif
    
    }
    
    #ifdef CONFIG_SERIAL_8250_CONSOLE
    static int __init omapl138_hawk_console_init(void)
    {
    	if (!machine_is_omapl138_hawkboard())
    		return 0;
    
    	return add_preferred_console("ttyS", 2, "115200");
    }
    console_initcall(omapl138_hawk_console_init);
    #endif
    
    static void __init omapl138_hawk_map_io(void)
    {
    	da850_init();
    }
    
    #ifdef CONFIG_HAWKBOARD_LCDK
    MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 LCDK")
    	.boot_params	= (DA8XX_DDR_BASE + 0x100),
    	.map_io		= omapl138_hawk_map_io,
    	.init_irq	= cp_intc_init,
    	.timer		= &davinci_timer,
    	.init_machine	= omapl138_hawk_init,
    	.dma_zone_size	= SZ_128M,
    MACHINE_END
    #else
    MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 Hawkboard")
    	.boot_params	= (DA8XX_DDR_BASE + 0x100),
    	.map_io		= omapl138_hawk_map_io,
    	.init_irq	= cp_intc_init,
    	.timer		= &davinci_timer,
    	.init_machine	= omapl138_hawk_init,
    	.dma_zone_size	= SZ_128M,
    MACHINE_END
    #endif
    

    8780.mux.h

    3730.log.txt
    Starting kernel ...
    
    Uncompressing Linux... done, booting the kernel.
    Linux version 3.1.10 (root@titus) (gcc version 4.5.3 20110311 (prerelease) (GCC) ) #20 PREEMPT Mon Apr 7 19:49:13 IST 2014
    CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
    CPU: VIVT data cache, VIVT instruction cache
    Machine: AM18x/OMAP-L138 LCDK
    Memory policy: ECC disabled, Data cache writeback
    DaVinci da850/omap-l138/am18x variant 0x1
    Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 8128
    Kernel command line: mem=32M console=ttyS2,115200 ip=dhcp nfsroot=10.100.1.97:/usr/local/filesystem_omapl138 root=/dev/nfs rw rootwai
    t
    PID hash table entries: 128 (order: -3, 512 bytes)
    Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
    Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
    Memory: 32MB = 32MB total
    Memory: 27736k/27736k available, 5032k reserved, 0K highmem
    Virtual kernel memory layout:
        vector  : 0xffff0000 - 0xffff1000   (   4 kB)
        fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
        DMA     : 0xff000000 - 0xffe00000   (  14 MB)
        vmalloc : 0xc2800000 - 0xfea00000   ( 962 MB)
        lowmem  : 0xc0000000 - 0xc2000000   (  32 MB)
        modules : 0xbf000000 - 0xc0000000   (  16 MB)
          .text : 0xc0008000 - 0xc0435050   (4277 kB)
          .init : 0xc0436000 - 0xc045a000   ( 144 kB)
          .data : 0xc045a000 - 0xc047eac0   ( 147 kB)
           .bss : 0xc047eae4 - 0xc0498cfc   ( 105 kB)
    SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
    Preemptible hierarchical RCU implementation.
    NR_IRQS:245
    Console: colour dummy device 80x30
    Calibrating delay loop... 227.32 BogoMIPS (lpj=1136640)
    pid_max: default: 32768 minimum: 301
    Mount-cache hash table entries: 512
    CPU: Testing write buffer coherency: ok
    DaVinci: 144 gpio irqs
    NET: Registered protocol family 16
    EMAC: MII PHY configured
    #### SPI DEBUG : da850_spi1_gpio_pins
    #### SPI DEBUG : SPI pinmux done ret = 0
    #### SPI DEBUG : da850_evm_init: SPI1 registration success: 0
    bio: create slab <bio-0> at 0
    SCSI subsystem initialized
    usbcore: registered new interface driver usbfs
    usbcore: registered new interface driver hub
    usbcore: registered new device driver usb
    Advanced Linux Sound Architecture Driver Version 1.0.24.
    Switching to clocksource timer0_1
    Switched to NOHz mode on CPU #0
    NET: Registered protocol family 2
    IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
    TCP established hash table entries: 1024 (order: 1, 8192 bytes)
    TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
    TCP: Hash tables configured (established 1024 bind 1024)
    TCP reno registered
    UDP hash table entries: 256 (order: 0, 4096 bytes)
    UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
    NET: Registered protocol family 1
    RPC: Registered named UNIX socket transport module.
    RPC: Registered udp transport module.
    RPC: Registered tcp transport module.
    RPC: Registered tcp NFSv4.1 backchannel transport module.
    NTFS driver 2.1.30 [Flags: R/O DEBUG].
    SGI XFS with security attributes, large block/inode numbers, no debug enabled
    msgmni has been set to 54
    io scheduler noop registered (default)
    da8xx_lcdc da8xx_lcdc.0: GLCD: Found VGA_Monitor panel
    Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
    serial8250.0: ttyS0 at MMIO 0x1c42000 (irq = 25) is a 16550A
    serial8250.0: ttyS1 at MMIO 0x1d0c000 (irq = 53) is a 16550A
    serial8250.0: ttyS2 at MMIO 0x1d0d000 (irq = 61) is a 16550A
    console [ttyS2] enabled
    brd: module loaded
    ahci ahci: forcing PORTS_IMPL to 0x1
    ahci ahci: AHCI 0001.0100 32 slots 1 ports 3 Gbps 0x1 impl platform mode
    ahci ahci: flags: ncq sntf pm led clo only pmp pio slum part ccc 
    scsi0 : ahci_platform
    ata1: SATA max UDMA/133 mmio [mem 0x01e18000-0x01e19fff] port 0x100 irq 67
    spi_davinci spi_davinci.1: DMA: supported
    spi_davinci spi_davinci.1: DMA: RX channel: 18, TX channel: 19, event queue: 0
    spi_davinci spi_davinci.1: Controller at 0xfef0e000
    davinci_mdio davinci_mdio.0: davinci mdio revision 1.5
    davinci_mdio davinci_mdio.0: detected phy mask ffffff7f
    davinci_mdio.0: probed
    davinci_mdio davinci_mdio.0: phy[7]: device 0:07, driver unknown
    ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
    ohci ohci.0: DA8xx OHCI
    ohci ohci.0: new USB bus registered, assigned bus number 1
    Waiting for USB PHY clock good...
    ohci ohci.0: irq 59, io mem 0x01e25000
    usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
    usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
    usb usb1: Product: DA8xx OHCI
    usb usb1: Manufacturer: Linux 3.1.10 ohci_hcd
    usb usb1: SerialNumber: ohci.0
    hub 1-0:1.0: USB hub found
    hub 1-0:1.0: 1 port detected
    usbcore: registered new interface driver uas
    Initializing USB Mass Storage driver...
    usbcore: registered new interface driver usb-storage
    USB Mass Storage support registered.
    omap_rtc omap_rtc: rtc core: registered omap_rtc as rtc0
    omap_rtc: RTC power up reset detected
    omap_rtc: already running
    i2c /dev entries driver
    davinci_mmc davinci_mmc.0: Using DMA, 4-bit mode
    asoc: tlv320aic3x-hifi <-> davinci-mcasp.0 mapping ok
    ALSA device list:
      #0: DA850/OMAP-L138 EVM
    TCP cubic registered
    NET: Registered protocol family 17
    davinci_emac davinci_emac.1: using random MAC addr: 32:2b:20:e7:14:1f
    mmc0: new SDHC card at address 1234
    console [netcon0] enabled
    netconsole: network logging started
    mmcblk0: mmc0:1234 SA04G 3.63 GiB 
    ata1: SATA link down (SStatus 0 SControl 300)
    omap_rtc omap_rtc: setting system clock to 2000-01-01 03:33:16 UTC (946697596)
     mmcblk0: p1 p2 p3
    davinci_mdio davinci_mdio.0: resetting idled controller
    net eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=0:07, id=7c0f1)
    usb 1-1: new full speed USB device number 2 using ohci
    usb 1-1: New USB device found, idVendor=0781, idProduct=5567
    usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    usb 1-1: Product: Cruzer Blade
    usb 1-1: Manufacturer: SanDisk
    usb 1-1: SerialNumber: 4C532000060313110254
    scsi1 : usb-storage 1-1:1.0
    scsi 1:0:0:0: Direct-Access     SanDisk  Cruzer Blade     1.26 PQ: 0 ANSI: 5
    sd 1:0:0:0: [sda] 31266816 512-byte logical blocks: (16.0 GB/14.9 GiB)
    sd 1:0:0:0: [sda] Write Protect is off
    sd 1:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
     sda: sda1
    sd 1:0:0:0: [sda] Attached SCSI removable disk
    PHY: 0:07 - Link is Up - 100/Full
    Sending DHCP requests ., OK
    IP-Config: Got DHCP answer from 0.0.0.0, my address is 10.100.1.157
    IP-Config: Complete:
    VFS: Mounted root (nfs filesystem) on device 0:12.
    Freeing init memory: 144K
    INIT: version 2.86 booting
    Please wait: booting...
    Starting udev
    udevd (980): /proc/980/oom_adj is deprecated, please use /proc/980/oom_score_adj instead.
    kjournald starting.  Commit interval 5 seconds
    
    
    EXT3-fs (mmcblk0p2): mounted filesystem with ordered data mode
    kjournald starting.  Commit interval 5 seconds
    modprobe: FATAL: Could not load /lib/modules/3.1.10/modules.dep: No such file or directory
    
    modprobe: FATAL: Could not load /lib/modules/3.1.10/modules.dep: No such file or directory
    
    Root filesystem already rw, not remounting
    Caching udev devnodes
    Populating dev cache
    WARNING: Couldn't open directory /lib/modules/3.1.10: No such file or directory
    FATAL: Could not open /lib/modules/3.1.10/modules.dep.temp for writing: No such file or directory
    modprobe: FATAL: Could not load /lib/modules/3.1.10/modules.dep: No such file or directory
    
    modprobe: FATAL: Could not load /lib/modules/3.1.10/modules.dep: No such file or directory
    
    modprobe: FATAL: Could not load /lib/modules/3.1.10/modules.dep: No such file or directory
    
    root: mount: mounting rootfs on / failed: No such file or directory
    ALSA: Restoring mixer settings...
    NOT configuring network interfaces: / is an NFS mount
    INIT: Entering runlevel: 5
    Starting system message bus: dbus.
    Starting telnet daemon.
    modprobe: FATAL: Could not load /lib/modules/3.1.10/modules.dep: No such file or directory
    
    Starting Vixie-cron.
    Starting syslogd/klogd: done
    Starting nSDK componentsError : Name or service not known
    Unsupported screen resolution detected. Aborting nSDK startup
    .
    
     _____                    _____           _         _   
    |  _  |___ ___ ___ ___   |  _  |___ ___  |_|___ ___| |_ 
    |     |  _| .'| . | . |  |   __|  _| . | | | -_|  _|  _|
    |__|__|_| |__,|_  |___|  |__|  |_| |___|_| |___|___|_|  
                  |___|                    |___|            
    
    Arago Project http://arago-project.org arago ttyS2
    
    Arago 2010.07 arago ttyS2
    
    arago login: 
    

    Please let us know the results.

  • No, it doesn't work.

    I took stock linux.
    I choosed lcdk config:
    make ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi- omapl138_lcdk_defconfig

    I wrote
    CONFIG_SPI=y
    CONFIG_SPI_BITBANG=y
    CONFIG_SPI_DAVINCI=y
    CONFIG_SPI_SPIDEV=y to .config file.

    Then I changed stock mux.h, da850.c, board_omapl138_hawk.c on files that you sent.

    Then I made kernel. I answered no on every ask turn on/off anything else in .config.

    As root fs I use ramdisk.

    Log file is almost the same as yours.

    I attached my uImage. Could you please load it on your LCDK? Maybe something wrong with mine..

    uImage_spi.rar
  • Hi,

    I attached my uImage. Could you please load it on your LCDK? Maybe something wrong with mine..

    No luck, I have used your kernel image (uImage) and kernel not able to detect USB (even USB driver loaded successfully)

    I'm using the same as yours except the board file what you shared(I have remove the DA850 SPI1 CS pinmux def)

    Ex:

    static short da8xx_evm_spi_pins[] __initdata = {
        DA850_SPI1_CLK,DA850_SPI1_SOMI,DA850_SPI1_SIMO,DA850_SPI1_SCS0,
        -1
    };

    static short da8xx_evm_spi_pins[] __initdata = {
        DA850_SPI1_CLK,DA850_SPI1_SOMI,DA850_SPI1_SIMO,
        -1
    };

    Log file is almost the same as yours.

    We cant decide this issue from the bootup logs,

    PFA of my kernel image (uImage) & .config,

    Try and let us know the results,

    5554.uImage_config.tar.gz

  • it was .config)
    I made kernel with your .config and USB ans SPI are working together now.

    Now will try to work with spidev.

    Thank you very much! VERY VERY MUCH!!

  • there is a new problem on the old question.

    I want to turn on spi Master 3-pin mode.
    I set reset, enable, clkmod, master, somifun,simofun, clkfun bits to 1 and I can see clock on SPI1_CLK pin.

    Then I wanted to start test program on my USB flash drive to see something on SPI1_SIMO. But linux doesn't want to mount Usb flash drive again. I unset bits one by one and explored that Usb doesn't works only after setting Enable bit in SPIGCR1 register.

    What can I do to get them both working?

    Thanks!

  • hi .

    i'm  working in lcdk with  spi  device(sensor)..   i done as per ur commands above shown.. 

    1.. board file

    2.  da850.c

    3. mux.h

      but i didnt get stil..  it means in my filesystem under the folder  /dev/spi_sensor  (spi_ sensor would  created)

    but it dint created

  • when i use ur uimage.. there will be /dev/spidev1.0.... but u given name as spidev.. so confusing

  • Hi Thangameena,

    Please mention the name (To whom you are asking for help) while you are asking the question, so that respective people will address your query.

    when i use ur uimage.. there will be /dev/spidev1.0.... but u given name as spidev.. so confusing

    "spidev" is the device name and "1.0" is ID (instance) for SPI.

    You can create multiple instance by modifying the "board" file.

    If you can further questions, please create new post for your question/problem since the current post seems to be old and might get less intervene.

    Thanks for your understanding.

  • Hi Thangameena,

    For example,

    From board file:

    static struct platform_device da830_evm_devices[] __initdata = {
    	{
    		.name		= "davinci_nand",
    		.id		= 1,
    		.dev		= {
    			.platform_data	= &da830_evm_nand_pdata,
    		},
    		.num_resources	= ARRAY_SIZE(da830_evm_nand_resources),
    		.resource	= da830_evm_nand_resources,
    	},
    };
    

    From kernel logs,

    Creating 4 MTD partitions on "davinci_nand.1":
    0x000000000000-0x000000020000 : "bootloader"
    0x000000020000-0x000000040000 : "params"
    0x000000040000-0x000000240000 : "kernel"
    0x000000240000-0x000020000000 : "filesystem"
    davinci_nand davinci_nand.1: controller rev. 2.5

    I hope this helps.

  • hi stalin.

    still i dint get  folder spi_dev  under /dev/spi_dev.. but i use ur uimage i got that.. i don know wher i done a mistake.

  • Hi Meena,

    Try the attached files from previous replies.

    Please ensure that you have enable SPI DEV support in kernel.

    make menuconfig ARCH=arm CROSS_COMPILE=arm-arago-linux-gnueabi-

       Device Drivers  --->

          [*] SPI support  --->

               <*>   User mode SPI device driver support

  •  hi Stalin..

     ya i configured spi device driver.. eventhough i dint get .. 

    my log 

    Linux version 3.1.10 (marudham@marudham-desktop) (gcc version 4.5.3 20110311 (p4
    CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
    CPU: VIVT data cache, VIVT instruction cache
    Machine: AM18x/OMAP-L138 LCDK
    Memory policy: ECC disabled, Data cache writeback
    DaVinci da850/omap-l138/am18x variant 0x1
    On node 0 totalpages: 32768
    free_area_init_node: node 0, pgdat c03ed040, node_mem_map c0412000
    DMA zone: 256 pages used for memmap
    DMA zone: 0 pages reserved
    DMA zone: 32512 pages, LIFO batch:7
    pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
    pcpu-alloc: [0] 0
    Built 1 zonelists in Zone order, mobility grouping on. Total pages: 32512
    Kernel command line: console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootwait ip=f
    PID hash table entries: 512 (order: -1, 2048 bytes)
    Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
    Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
    Memory: 128MB = 128MB total
    Memory: 125740k/125740k available, 5332k reserved, 0K highmem
    Virtual kernel memory layout:
    vector : 0xffff0000 - 0xffff1000 ( 4 kB)
    fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
    DMA : 0xff000000 - 0xffe00000 ( 14 MB)
    vmalloc : 0xc8800000 - 0xfea00000 ( 866 MB)
    lowmem : 0xc0000000 - 0xc8000000 ( 128 MB)
    modules : 0xbf000000 - 0xc0000000 ( 16 MB)
    .text : 0xc0008000 - 0xc03a2714 (3690 kB)
    .init : 0xc03a3000 - 0xc03c6000 ( 140 kB)
    .data : 0xc03c6000 - 0xc03edaa0 ( 159 kB)
    .bss : 0xc03edac4 - 0xc0411f9c ( 146 kB)
    SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
    Preemptible hierarchical RCU implementation.
    NR_IRQS:245
    Console: colour dummy device 80x30
    Calibrating delay loop... 148.88 BogoMIPS (lpj=744448)
    pid_max: default: 32768 minimum: 301
    Mount-cache hash table entries: 512
    CPU: Testing write buffer coherency: ok
    DaVinci: 144 gpio irqs
    NET: Registered protocol family 16
    EMAC: MII PHY configured
    #### SPI DEBUG : da850_spi1_gpio_pins
    #### SPI DEBUG : SPI pinmux done ret = 0
    #### SPI DEBUG : da850_evm_init: SPI1 registration success: 0
    bio: create slab <bio-0> at 0
    SCSI subsystem initialized
    usbcore: registered new interface driver usbfs
    usbcore: registered new interface driver hub
    usbcore: registered new device driver usb
    Advanced Linux Sound Architecture Driver Version 1.0.24.
    Switching to clocksource timer0_1
    Switched to NOHz mode on CPU #0
    musb-hdrc: version 6.0, ?dma?, otg (peripheral+host)
    NET: Registered protocol family 2
    IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
    TCP established hash table entries: 4096 (order: 3, 32768 bytes)
    TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
    TCP: Hash tables configured (established 4096 bind 4096)
    TCP reno registered
    UDP hash table entries: 256 (order: 0, 4096 bytes)
    UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
    NET: Registered protocol family 1
    RPC: Registered named UNIX socket transport module.
    RPC: Registered udp transport module.
    RPC: Registered tcp transport module.
    RPC: Registered tcp NFSv4.1 backchannel transport module.
    msgmni has been set to 245
    io scheduler noop registered (default)
    da8xx_lcdc da8xx_lcdc.0: GLCD: Found VGA_Monitor panel
    Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
    serial8250.0: ttyS0 at MMIO 0x1c42000 (irq = 25) is a 16550A
    serial8250.0: ttyS1 at MMIO 0x1d0c000 (irq = 53) is a 16550A
    serial8250.0: ttyS2 at MMIO 0x1d0d000 (irq = 61) is a 16550A
    console [ttyS2] enabled
    brd: module loaded
    spi_davinci spi_davinci.1: DMA: supported
    spi_davinci spi_davinci.1: DMA: RX channel: 18, TX channel: 19, event queue: 0
    spi_davinci spi_davinci.1: registered master spi1
    spi spi1.0: setup mode 0, 8 bits/w, 8000000 Hz max --> 0
    spi_davinci spi_davinci.1: registered child spi1.0
    spi_davinci spi_davinci.1: Controller at 0xfef0e000
    davinci_mdio davinci_mdio.0: davinci mdio revision 1.5
    davinci_mdio davinci_mdio.0: detected phy mask ffffff7f
    davinci_mdio.0: probed
    davinci_mdio davinci_mdio.0: phy[7]: device 0:07, driver unknown
    ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
    ohci ohci.0: DA8xx OHCI
    ohci ohci.0: new USB bus registered, assigned bus number 1
    Waiting for USB PHY clock good...
    ohci ohci.0: irq 59, io mem 0x01e25000
    usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
    usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
    usb usb1: Product: DA8xx OHCI
    usb usb1: Manufacturer: Linux 3.1.10 ohci_hcd
    usb usb1: SerialNumber: ohci.0
    hub 1-0:1.0: USB hub found
    hub 1-0:1.0: 1 port detected
    usbcore: registered new interface driver uas
    Initializing USB Mass Storage driver...
    usbcore: registered new interface driver usb-storage
    USB Mass Storage support registered.
    usbcore: registered new interface driver usbserial
    usbserial: USB Serial Driver core
    USB Serial support registered for cp210x
    usbcore: registered new interface driver cp210x
    cp210x: v0.09:Silicon Labs CP210x RS232 serial adaptor driver
    USB Serial support registered for FTDI USB Serial Device
    usbcore: registered new interface driver ftdi_sio
    ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver
    USB Serial support registered for pl2303
    usbcore: registered new interface driver pl2303
    pl2303: Prolific PL2303 USB to serial adaptor driver
    omap_rtc omap_rtc: rtc core: registered omap_rtc as rtc0
    omap_rtc: RTC power up reset detected
    i2c /dev entries driver
    davinci_mmc davinci_mmc.0: Using DMA, 4-bit mode
    asoc: tlv320aic3x-hifi <-> davinci-mcasp.0 mapping ok
    ALSA device list:
    #0: DA850/OMAP-L138 EVM
    TCP cubic registered
    NET: Registered protocol family 17
    davinci_emac davinci_emac.1: using random MAC addr: e2:b2:8a:99:df:98
    console [netcon0] enabled
    netconsole: network logging started
    omap_rtc omap_rtc: setting system clock to 2000-01-01 00:00:00 UTC (946684800)
    Waiting for root device /dev/mmcblk0p2...
    mmc0: new SD card at address 1234
    mmcblk0: mmc0:1234 SA02G 1.83 GiB
    mmcblk0: p1 p2 p3
    EXT3-fs (mmcblk0p2): warning: maximal mount count reached, running e2fsck is red
    kjournald starting. Commit interval 5 seconds
    EXT3-fs (mmcblk0p2): using internal journal
    EXT3-fs (mmcblk0p2): recovery complete
    EXT3-fs (mmcblk0p2): mounted filesystem with ordered data mode
    VFS: Mounted root (ext3 filesystem) on device 179:2.
    Freeing init memory: 140K
    udevd (968): /proc/968/oom_adj is deprecated, please use /proc/968/oom_score_ad.
    EXT3-fs (mmcblk0p3): warning: maximal mount count reached, running e2fsck is red
    kjournald starting. Commit interval 5 seconds
    EXT3-fs (mmcblk0p3): using internal journal
    EXT3-fs (mmcblk0p3): recovery complete
    EXT3-fs (mmcblk0p3): mounted filesystem with ordered data mode
    NET: Registered protocol family 10
    davinci_mdio davinci_mdio.0: resetting idled controller
    net eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=0:07, id=7c0f1)
    ADDRCONF(NETDEV_UP): eth0: link is not ready

  • Hi Meena,

    Could you please attach your board file.

  • here with i attached my board file.. i given name as spi_sensor.. but i didnt get it under /dev

    8176.my board.c
    /*
     * Hawkboard.org based on TI's OMAP-L138 Platform
     *
     * Initial code: Syed Mohammed Khasim
     * Additional code derived from: arch/arm/mach-davinci/board-da850-evm.c
     *
     * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com
     *
     * This file is licensed under the terms of the GNU General Public License
     * version 2. This program is licensed "as is" without any warranty of
     * any kind, whether express or implied.
     */
    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/console.h>
    #include <linux/gpio.h>
    #include <linux/i2c.h>
    #include <linux/spi/biometric.h> //
    
    #include <asm/mach-types.h>
    #include <asm/mach/arch.h>
    
    #include <mach/cp_intc.h>
    #include <mach/da8xx.h>
    #include <mach/mux.h>
     
    
    
    #define HAWKBOARD_PHY_ID		"0:07"
    #define DA850_LCD_PWR_PIN		GPIO_TO_PIN(2, 8)
    #define DA850_LCD_BL_PIN		GPIO_TO_PIN(2, 15)
    
    #ifdef  CONFIG_HAWKBOARD_LCDK
    #define DA850_HAWK_MMCSD_CD_PIN		GPIO_TO_PIN(4, 0)
    #else
    #define DA850_HAWK_MMCSD_CD_PIN		GPIO_TO_PIN(3, 12)
    #endif
    
    #define DA850_HAWK_MMCSD_WP_PIN		GPIO_TO_PIN(3, 13)
    #define DA850_HAWK_USER_LED0		GPIO_TO_PIN(6, 12)
    #define DA850_HAWK_USER_LED1		GPIO_TO_PIN(6, 13)
    #define DA850_USB1_VBUS_PIN		GPIO_TO_PIN(2, 4)
    #define DA850_USB1_OC_PIN		GPIO_TO_PIN(6, 13)
    
    #define HAWKBOARD_SATA_REFCLKPN_RATE	(100 * 1000 * 1000)
    #define BIOMETRIC_RST_GPIO     GPIO_TO_PIN(2,0)     //PM_GPIO6
    #define BIOMETRIC_WKP_GPIO     GPIO_TO_PIN(3,15)     //PM_GPIO17
    
    
    static short omapl138_hawk_mii_pins[] __initdata = {
    	DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
    	DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
    	DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
    	DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
    	DA850_MDIO_D,
    	-1
    };
    
    static __init void omapl138_hawk_config_emac(void)
    {
    	void __iomem *cfgchip3 = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);
    	int ret;
    	u32 val;
    	struct davinci_soc_info *soc_info = &davinci_soc_info;
    
    	val = __raw_readl(cfgchip3);
    	val &= ~BIT(8);
    	ret = davinci_cfg_reg_list(omapl138_hawk_mii_pins);
    	if (ret) {
    		pr_warning("%s: cpgmac/mii mux setup failed: %d\n",
    			__func__, ret);
    		return;
    	}
    
    	/* configure the CFGCHIP3 register for MII */
    	__raw_writel(val, cfgchip3);
    	pr_info("EMAC: MII PHY configured\n");
    
    	soc_info->emac_pdata->phy_id = HAWKBOARD_PHY_ID;
    
    	ret = da8xx_register_emac();
    	if (ret)
    		pr_warning("%s: emac registration failed: %d\n",
    			__func__, ret);
    }
    
    /*
     * The following EDMA channels/slots are not being used by drivers (for
     * example: Timer, GPIO, UART events etc) on da850/omap-l138 EVM/Hawkboard,
     * hence they are being reserved for codecs on the DSP side.
     */
    static const s16 da850_dma0_rsv_chans[][2] = {
    	/* (offset, number) */
    	{ 8,  6},
    	{24,  4},
    	{30,  2},
    	{-1, -1}
    };
    
    static const s16 da850_dma0_rsv_slots[][2] = {
    	/* (offset, number) */
    	{ 8,  6},
    	{24,  4},
    	{30, 50},
    	{-1, -1}
    };
    
    static const s16 da850_dma1_rsv_chans[][2] = {
    	/* (offset, number) */
    	{ 0, 28},
    	{30,  2},
    	{-1, -1}
    };
    
    static const s16 da850_dma1_rsv_slots[][2] = {
    	/* (offset, number) */
    	{ 0, 28},
    	{30, 90},
    	{-1, -1}
    };
    
    static struct edma_rsv_info da850_edma_cc0_rsv = {
    	.rsv_chans	= da850_dma0_rsv_chans,
    	.rsv_slots	= da850_dma0_rsv_slots,
    };
    
    static struct edma_rsv_info da850_edma_cc1_rsv = {
    	.rsv_chans	= da850_dma1_rsv_chans,
    	.rsv_slots	= da850_dma1_rsv_slots,
    };
    
    static struct edma_rsv_info *da850_edma_rsv[2] = {
    	&da850_edma_cc0_rsv,
    	&da850_edma_cc1_rsv,
    };
    
    static const short hawk_mmcsd0_pins[] = {
    	DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2,
    	DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD,
    	DA850_GPIO3_12, DA850_GPIO3_13,
    	-1
    };
    
    static int da850_hawk_mmc_get_ro(int index)
    {
    #ifdef CONFIG_HAWKBOARD_LCDK
    	return 0;
    #else
    	return gpio_get_value(DA850_HAWK_MMCSD_WP_PIN);
    #endif
    }
    
    static int da850_hawk_mmc_get_cd(int index)
    {
    	return !gpio_get_value(DA850_HAWK_MMCSD_CD_PIN);
    }
    
    static struct davinci_mmc_config da850_mmc_config = {
    	.get_ro		= da850_hawk_mmc_get_ro,
    	.get_cd		= da850_hawk_mmc_get_cd,
    	.wires		= 4,
    	.max_freq	= 50000000,
    	.caps		= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
    	.version	= MMC_CTLR_VERSION_2,
    };
    
    static __init void omapl138_hawk_mmc_init(void)
    {
    	int ret;
    
    	ret = davinci_cfg_reg_list(hawk_mmcsd0_pins);
    	if (ret) {
    		pr_warning("%s: MMC/SD0 mux setup failed: %d\n",
    			__func__, ret);
    		return;
    	}
    
    	ret = gpio_request_one(DA850_HAWK_MMCSD_CD_PIN,
    			GPIOF_DIR_IN, "MMC CD");
    	if (ret < 0) {
    		pr_warning("%s: can not open GPIO %d\n",
    			__func__, DA850_HAWK_MMCSD_CD_PIN);
    		return;
    	}
    
    	ret = gpio_request_one(DA850_HAWK_MMCSD_WP_PIN,
    			GPIOF_DIR_IN, "MMC WP");
    	if (ret < 0) {
    		pr_warning("%s: can not open GPIO %d\n",
    			__func__, DA850_HAWK_MMCSD_WP_PIN);
    		goto mmc_setup_wp_fail;
    	}
    
    	ret = da8xx_register_mmcsd0(&da850_mmc_config);
    	if (ret) {
    		pr_warning("%s: MMC/SD0 registration failed: %d\n",
    			__func__, ret);
    		goto mmc_setup_mmcsd_fail;
    	}
    
    	return;
    
    mmc_setup_mmcsd_fail:
    	gpio_free(DA850_HAWK_MMCSD_WP_PIN);
    mmc_setup_wp_fail:
    	gpio_free(DA850_HAWK_MMCSD_CD_PIN);
    }
    
    static irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id);
    static da8xx_ocic_handler_t hawk_usb_ocic_handler;
    
    static const short da850_hawk_usb11_pins[] = {
    	DA850_GPIO2_4, DA850_GPIO6_13,
    	-1
    };
    
    static int hawk_usb_set_power(unsigned port, int on)
    {
    	gpio_set_value(DA850_USB1_VBUS_PIN, on);
    	return 0;
    }
    
    static int hawk_usb_get_power(unsigned port)
    {
    	return gpio_get_value(DA850_USB1_VBUS_PIN);
    }
    
    static int hawk_usb_get_oci(unsigned port)
    {
    	return !gpio_get_value(DA850_USB1_OC_PIN);
    }
    
    static int hawk_usb_ocic_notify(da8xx_ocic_handler_t handler)
    {
    	int irq         = gpio_to_irq(DA850_USB1_OC_PIN);
    	int error       = 0;
    
    	if (handler != NULL) {
    		hawk_usb_ocic_handler = handler;
    
    		error = request_irq(irq, omapl138_hawk_usb_ocic_irq,
    					IRQF_DISABLED | IRQF_TRIGGER_RISING |
    					IRQF_TRIGGER_FALLING,
    					"OHCI over-current indicator", NULL);
    		if (error)
    			pr_err("%s: could not request IRQ to watch "
    				"over-current indicator changes\n", __func__);
    	} else {
    		free_irq(irq, NULL);
    	}
    	return error;
    }
    
    static struct da8xx_ohci_root_hub omapl138_hawk_usb11_pdata = {
    	.set_power      = hawk_usb_set_power,
    	.get_power      = hawk_usb_get_power,
    	.get_oci        = hawk_usb_get_oci,
    	.ocic_notify    = hawk_usb_ocic_notify,
    	/* TPS2087 switch @ 5V */
    	.potpgt         = (3 + 1) / 2,  /* 3 ms max */
    };
    
    static irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id)
    {
    	hawk_usb_ocic_handler(&omapl138_hawk_usb11_pdata, 1);
    	return IRQ_HANDLED;
    }
    
    static __init void omapl138_hawk_usb_init(void)
    {
    	int ret;
    	u32 cfgchip2;
    
    	ret = davinci_cfg_reg_list(da850_hawk_usb11_pins);
    	if (ret) {
    		pr_warning("%s: USB 1.1 PinMux setup failed: %d\n",
    			__func__, ret);
    		return;
    	}
    
    	/* Setup the Ref. clock frequency for the HAWK at 24 MHz. */
    
    	cfgchip2 = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
    	cfgchip2 &= ~CFGCHIP2_REFFREQ;
    	cfgchip2 |=  CFGCHIP2_REFFREQ_24MHZ;
    	__raw_writel(cfgchip2, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
    
    	ret = gpio_request_one(DA850_USB1_VBUS_PIN,
    			GPIOF_DIR_OUT, "USB1 VBUS");
    	if (ret < 0) {
    		pr_err("%s: failed to request GPIO for USB 1.1 port "
    			"power control: %d\n", __func__, ret);
    		return;
    	}
    
    	ret = gpio_request_one(DA850_USB1_OC_PIN,
    			GPIOF_DIR_IN, "USB1 OC");
    	if (ret < 0) {
    		pr_err("%s: failed to request GPIO for USB 1.1 port "
    			"over-current indicator: %d\n", __func__, ret);
    		goto usb11_setup_oc_fail;
    	}
    
    	ret = da8xx_register_usb11(&omapl138_hawk_usb11_pdata);
    	if (ret) {
    		pr_warning("%s: USB 1.1 registration failed: %d\n",
    			__func__, ret);
    		goto usb11_setup_fail;
    	}
    
    	return;
    
    usb11_setup_fail:
    	gpio_free(DA850_USB1_OC_PIN);
    usb11_setup_oc_fail:
    	gpio_free(DA850_USB1_VBUS_PIN);
    }
    
    static struct davinci_uart_config omapl138_hawk_uart_config __initdata = {
    	.enabled_uarts = 0x7,
    };
    
    #ifdef CONFIG_CPU_FREQ
    static __init int omapl138_lcdk_init_cpufreq(void)
    {
    	switch (system_rev & 0xF) {
    	case 3:
    		da850_max_speed = 456000;
    		break;
    	case 2:
    		da850_max_speed = 408000;
    		break;
    	case 1:
    		da850_max_speed = 372000;
    		break;
    	}
    
    	return da850_register_cpufreq("pll0_sysclk3");
    }
    #else
    static __init int omapl138_lcdk_init_cpufreq(void) { return 0; }
    #endif
    
    /* I2C */
    static struct i2c_board_info __initdata omapl138_hawk_i2c_devices[] = {
    	{
    		I2C_BOARD_INFO("tlv320aic3x", 0x18),
    	},
    };
    
    static struct davinci_i2c_platform_data omapl138_hawk_i2c_0_pdata = {
    
    	.bus_freq	= 100,	/* kHz */
    	.bus_delay	= 0,	/* usec */
    };
    
    static void omapl138_hawk_i2c_init(void)
    	{
    	int ret;
    	ret = davinci_cfg_reg_list(da850_i2c0_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: i2c0 mux setup failed: %d\n",
    				ret);
    
    	ret = da8xx_register_i2c(0, &omapl138_hawk_i2c_0_pdata);
    	if (ret)
    		pr_warning("omapl138_hawk_init: i2c0 registration failed: %d\n",
    				ret);
    	i2c_register_board_info(1, omapl138_hawk_i2c_devices,
    			ARRAY_SIZE(omapl138_hawk_i2c_devices));
    }
    
    /* VGA */
    static const short omapl138_hawk_lcdc_pins[] = {
    	DA850_GPIO2_8, DA850_GPIO2_15,
     	-1
    };
    
    /* Backlight and power is for use with LCD expansion header only */
    static void da850_panel_power_ctrl(int val)
    {
    	/* lcd backlight */
    	gpio_set_value(DA850_LCD_BL_PIN, val);
    	/* lcd power */
    	gpio_set_value(DA850_LCD_PWR_PIN, val);
    }
    
    static int da850_lcd_hw_init(void)
    {
    	int status;
    
    	status = gpio_request(DA850_LCD_BL_PIN, "lcd bl\n");
    	if (status < 0)
    		return status;
    
    	status = gpio_request(DA850_LCD_PWR_PIN, "lcd pwr\n");
    	if (status < 0) {
    		gpio_free(DA850_LCD_BL_PIN);
    		return status;
    	}
    
    	gpio_direction_output(DA850_LCD_BL_PIN, 0);
    	gpio_direction_output(DA850_LCD_PWR_PIN, 0);
    
    	/* Switch off panel power and backlight */
    	da850_panel_power_ctrl(0);
    
    	/* Switch on panel power and backlight */
    	da850_panel_power_ctrl(1);
    
    	return 0;
    }
    
    static void omapl138_hawk_display_init(void)
    {
    	int ret;
    
    	ret = davinci_cfg_reg_list(da850_lcdcntl_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: lcdcntl mux setup failed: %d\n",
    				ret);
    	
    	ret = davinci_cfg_reg_list(omapl138_hawk_lcdc_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: evm specific lcd mux setup "
    				"failed: %d\n",	ret);
    
    	da850_lcd_hw_init();
    
    	ret = da8xx_register_lcdc(&vga_monitor_pdata);
    	if (ret)
    		pr_warning("omapl138_hawk_init: lcdc registration failed: %d\n",
    				ret);
    }
    
    /* Set up OMAP-L138 Hawkboard/ LCDK low-level McASP driver */
    static u8 da850_iis_serializer_direction[] = {
    	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
    	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
    	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
    	INACTIVE_MODE,	TX_MODE,	RX_MODE,	INACTIVE_MODE,
    };
    
    static struct snd_platform_data omapl138_hawk_snd_data = {
    
          
    	.tx_dma_offset	= 0x2000,
    	.rx_dma_offset	= 0x2000,
    	.op_mode	= DAVINCI_MCASP_IIS_MODE,
    	.num_serializer	= ARRAY_SIZE(da850_iis_serializer_direction),
    	.tdm_slots	= 2,
    	.serial_dir	= da850_iis_serializer_direction,
    	.asp_chan_q	= EVENTQ_0,
    	.version	= MCASP_VERSION_2,
    	.txnumevt	= 1,
    	.rxnumevt	= 1,
    };
    
    static const short omapl138_hawk_mcasp_pins[] __initconst = {
    	DA850_AHCLKX, DA850_ACLKX, DA850_AFSX,
    	DA850_AHCLKR, DA850_ACLKR, DA850_AFSR, DA850_AMUTE,
    	DA850_AXR_11, DA850_AXR_12,
    	-1
    };
    
    //////////////// spi///////////////////
    static short da850_spi1_gpio_pins[] __initdata= { 
    DA850_GPIO2_0,
    DA850_GPIO3_15,
    -1 
    };
    
    static short da8xx_evm_spi_pins[] __initdata = {
    	
    DA850_SPI1_CLK,DA850_SPI1_SOMI,DA850_SPI1_SIMO,DA850_SPI1_SCS0,
    	-1
    };
    
    
    static struct biometric_platform_data spi_sensor_data = {
    	.reset_gpio = GPIO_TO_PIN(2,0),
    	.wkp_gpio = GPIO_TO_PIN(3,15),
    };
    
    static struct spi_board_info da850evm_spi_info[]= {
            {
                   .modalias		= "spi_sensor",
                   .platform_data		= &spi_sensor_data,
                    .mode                   = SPI_MODE_0,
                    .max_speed_hz           = 8000000,
                    .bus_num                = 1,
                    .chip_select            = 0,
            },
    };
    
    static void omapl138_hawk_sound_init(void)
    {
    	int ret;
    	ret = davinci_cfg_reg_list(omapl138_hawk_mcasp_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: mcasp mux setup failed: %d\n",
    				ret);
    
    	da8xx_register_mcasp(0, &omapl138_hawk_snd_data);
    }
    
    static __init void omapl138_hawk_init(void)
    {
    	int ret;
    
    	davinci_serial_init(&omapl138_hawk_uart_config);
    	/*
    	 * shut down uart 0 and 1; they are not used on this board and
    	 * accessing them causes endless "too much work in irq53" messages
    	 * with arago fs
    	 */
    	__raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
    	__raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
    
    	omapl138_hawk_config_emac();
    
    	ret = da850_register_edma(da850_edma_rsv);
    	if (ret)
    		pr_warning("%s: EDMA registration failed: %d\n",
    			__func__, ret);
    
    	omapl138_hawk_mmc_init();
    
    	omapl138_hawk_usb_init();
    
    	ret = da8xx_register_watchdog();
    	if (ret)
    		pr_warning("omapl138_hawk_init: "
    			"watchdog registration failed: %d\n",
    			ret);
    
    	ret = da8xx_register_rtc();
    	if (ret)
    		pr_warning("omapl138_hawk_init: rtc setup failed: %d\n", ret);
    
    	ret = omapl138_lcdk_init_cpufreq();
    	if (ret)
    		pr_warning("omapl138_hawk_init: cpufreq registration failed: %d\n",
    				ret);
    
    	ret = da8xx_register_cpuidle();
    	if (ret)
    		pr_warning("omapl138_hawk_init: cpuidle registration failed: %d\n",
    				ret);
    
    	omapl138_hawk_i2c_init();
    	omapl138_hawk_display_init();
    	omapl138_hawk_sound_init();
    
    	ret = da850_register_sata(HAWKBOARD_SATA_REFCLKPN_RATE);
    	if (ret)
    		pr_warning("omapl138_lcdk_init: sata registration failed: %d\n",
    				ret);
    
    /*-------NEW_FOR_SPI-----------*/
    
    
    
    	printk("#### SPI DEBUG : da850_spi1_gpio_pins\n");
    
    
    	ret = davinci_cfg_reg_list(da850_spi1_gpio_pins);
    	ret = davinci_cfg_reg_list(da8xx_evm_spi_pins);
    	printk("#### SPI DEBUG : SPI pinmux done ret = %d\n",ret);
    	ret = da8xx_register_spi(1, da850evm_spi_info,ARRAY_SIZE(da850evm_spi_info));
    
    	if (ret){
    		pr_warning("#### SPI DEBUG : da850_evm_init: SPI1 registration failed: %d\n",ret);
    		}
    	else
    		{
    		printk("#### SPI DEBUG : da850_evm_init: SPI1 registration success: %d\n",ret);		
    		}
    
    
    }
    
    #ifdef CONFIG_SERIAL_8250_CONSOLE
    static int __init omapl138_hawk_console_init(void)
    {
    	if (!machine_is_omapl138_hawkboard())
    		return 0;
    
    	return add_preferred_console("ttyS", 2, "115200");
    }
    console_initcall(omapl138_hawk_console_init);
    #endif
    
    static void __init omapl138_hawk_map_io(void)
    {
    	da850_init();
    }
    
    #ifdef CONFIG_HAWKBOARD_LCDK
    MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 LCDK")
    	.boot_params	= (DA8XX_DDR_BASE + 0x100),
    	.map_io		= omapl138_hawk_map_io,
    	.init_irq	= cp_intc_init,
    	.timer		= &davinci_timer,
    	.init_machine	= omapl138_hawk_init,
    	.dma_zone_size	= SZ_128M,
    
    MACHINE_END
    #else
    MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 Hawkboard")
    	.boot_params	= (DA8XX_DDR_BASE + 0x100),
    	.map_io		= omapl138_hawk_map_io,
    	.init_irq	= cp_intc_init,
    	.timer		= &davinci_timer,
    	.init_machine	= omapl138_hawk_init,
    	.dma_zone_size	= SZ_128M,
    MACHINE_END
    #endif
    
    
    
    		
    
    

  • Hi Meena,

    Have you modified the "modalias" member to "spidev" ?

    If you mentioned name to "spi_sensor" then you might have get "/dev/spi_sensor" ,

    Do you have SPI driver for 'spi_sensor" device ?

  • thanks stalin

    yes .. i modified as spidev.. then i got spidev1.0...  

    i have a doubt.. in defconfig  file ... if i connecting sensor. i need to enable both (spidev=y and spi_sensor=y) or any one.. 

  • Hi Meena,

    Actually, "SPIDEV" is for to test the SPI from user space.

    Type "h" (help) for particular CONFIG option when you initiate "make menuconfig" to know about the config.

    If you have SPI device on SPI bus  (ex : SPI sensor )fingerprint)) then you have to select the particular SPI driver (given by fingerprint vendor) and should pass the platform data to that driver for initializing.