Path: blob/master/arch/arm/mach-msm/devices-msm7x00.c
10817 views
/* linux/arch/arm/mach-msm/devices.c1*2* Copyright (C) 2008 Google, Inc.3*4* This software is licensed under the terms of the GNU General Public5* License version 2, as published by the Free Software Foundation, and6* may be copied, distributed, and modified under those terms.7*8* This program is distributed in the hope that it will be useful,9* but WITHOUT ANY WARRANTY; without even the implied warranty of10* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the11* GNU General Public License for more details.12*13*/1415#include <linux/kernel.h>16#include <linux/platform_device.h>17#include <linux/clkdev.h>1819#include <mach/irqs.h>20#include <mach/msm_iomap.h>21#include "devices.h"2223#include <asm/mach/flash.h>24#include <linux/mtd/nand.h>25#include <linux/mtd/partitions.h>2627#include "clock.h"28#include "clock-pcom.h"29#include <mach/mmc.h>3031static struct resource resources_uart1[] = {32{33.start = INT_UART1,34.end = INT_UART1,35.flags = IORESOURCE_IRQ,36},37{38.start = MSM_UART1_PHYS,39.end = MSM_UART1_PHYS + MSM_UART1_SIZE - 1,40.flags = IORESOURCE_MEM,41.name = "uart_resource"42},43};4445static struct resource resources_uart2[] = {46{47.start = INT_UART2,48.end = INT_UART2,49.flags = IORESOURCE_IRQ,50},51{52.start = MSM_UART2_PHYS,53.end = MSM_UART2_PHYS + MSM_UART2_SIZE - 1,54.flags = IORESOURCE_MEM,55.name = "uart_resource"56},57};5859static struct resource resources_uart3[] = {60{61.start = INT_UART3,62.end = INT_UART3,63.flags = IORESOURCE_IRQ,64},65{66.start = MSM_UART3_PHYS,67.end = MSM_UART3_PHYS + MSM_UART3_SIZE - 1,68.flags = IORESOURCE_MEM,69.name = "uart_resource"70},71};7273struct platform_device msm_device_uart1 = {74.name = "msm_serial",75.id = 0,76.num_resources = ARRAY_SIZE(resources_uart1),77.resource = resources_uart1,78};7980struct platform_device msm_device_uart2 = {81.name = "msm_serial",82.id = 1,83.num_resources = ARRAY_SIZE(resources_uart2),84.resource = resources_uart2,85};8687struct platform_device msm_device_uart3 = {88.name = "msm_serial",89.id = 2,90.num_resources = ARRAY_SIZE(resources_uart3),91.resource = resources_uart3,92};9394static struct resource resources_i2c[] = {95{96.start = MSM_I2C_PHYS,97.end = MSM_I2C_PHYS + MSM_I2C_SIZE - 1,98.flags = IORESOURCE_MEM,99},100{101.start = INT_PWB_I2C,102.end = INT_PWB_I2C,103.flags = IORESOURCE_IRQ,104},105};106107struct platform_device msm_device_i2c = {108.name = "msm_i2c",109.id = 0,110.num_resources = ARRAY_SIZE(resources_i2c),111.resource = resources_i2c,112};113114static struct resource resources_hsusb[] = {115{116.start = MSM_HSUSB_PHYS,117.end = MSM_HSUSB_PHYS + MSM_HSUSB_SIZE,118.flags = IORESOURCE_MEM,119},120{121.start = INT_USB_HS,122.end = INT_USB_HS,123.flags = IORESOURCE_IRQ,124},125};126127struct platform_device msm_device_hsusb = {128.name = "msm_hsusb",129.id = -1,130.num_resources = ARRAY_SIZE(resources_hsusb),131.resource = resources_hsusb,132.dev = {133.coherent_dma_mask = 0xffffffff,134},135};136137struct flash_platform_data msm_nand_data = {138.parts = NULL,139.nr_parts = 0,140};141142static struct resource resources_nand[] = {143[0] = {144.start = 7,145.end = 7,146.flags = IORESOURCE_DMA,147},148};149150struct platform_device msm_device_nand = {151.name = "msm_nand",152.id = -1,153.num_resources = ARRAY_SIZE(resources_nand),154.resource = resources_nand,155.dev = {156.platform_data = &msm_nand_data,157},158};159160struct platform_device msm_device_smd = {161.name = "msm_smd",162.id = -1,163};164165static struct resource resources_sdc1[] = {166{167.start = MSM_SDC1_PHYS,168.end = MSM_SDC1_PHYS + MSM_SDC1_SIZE - 1,169.flags = IORESOURCE_MEM,170},171{172.start = INT_SDC1_0,173.end = INT_SDC1_0,174.flags = IORESOURCE_IRQ,175.name = "cmd_irq",176},177{178.start = INT_SDC1_1,179.end = INT_SDC1_1,180.flags = IORESOURCE_IRQ,181.name = "pio_irq",182},183{184.flags = IORESOURCE_IRQ | IORESOURCE_DISABLED,185.name = "status_irq"186},187{188.start = 8,189.end = 8,190.flags = IORESOURCE_DMA,191},192};193194static struct resource resources_sdc2[] = {195{196.start = MSM_SDC2_PHYS,197.end = MSM_SDC2_PHYS + MSM_SDC2_SIZE - 1,198.flags = IORESOURCE_MEM,199},200{201.start = INT_SDC2_0,202.end = INT_SDC2_0,203.flags = IORESOURCE_IRQ,204.name = "cmd_irq",205},206{207.start = INT_SDC2_1,208.end = INT_SDC2_1,209.flags = IORESOURCE_IRQ,210.name = "pio_irq",211},212{213.flags = IORESOURCE_IRQ | IORESOURCE_DISABLED,214.name = "status_irq"215},216{217.start = 8,218.end = 8,219.flags = IORESOURCE_DMA,220},221};222223static struct resource resources_sdc3[] = {224{225.start = MSM_SDC3_PHYS,226.end = MSM_SDC3_PHYS + MSM_SDC3_SIZE - 1,227.flags = IORESOURCE_MEM,228},229{230.start = INT_SDC3_0,231.end = INT_SDC3_0,232.flags = IORESOURCE_IRQ,233.name = "cmd_irq",234},235{236.start = INT_SDC3_1,237.end = INT_SDC3_1,238.flags = IORESOURCE_IRQ,239.name = "pio_irq",240},241{242.flags = IORESOURCE_IRQ | IORESOURCE_DISABLED,243.name = "status_irq"244},245{246.start = 8,247.end = 8,248.flags = IORESOURCE_DMA,249},250};251252static struct resource resources_sdc4[] = {253{254.start = MSM_SDC4_PHYS,255.end = MSM_SDC4_PHYS + MSM_SDC4_SIZE - 1,256.flags = IORESOURCE_MEM,257},258{259.start = INT_SDC4_0,260.end = INT_SDC4_0,261.flags = IORESOURCE_IRQ,262.name = "cmd_irq",263},264{265.start = INT_SDC4_1,266.end = INT_SDC4_1,267.flags = IORESOURCE_IRQ,268.name = "pio_irq",269},270{271.flags = IORESOURCE_IRQ | IORESOURCE_DISABLED,272.name = "status_irq"273},274{275.start = 8,276.end = 8,277.flags = IORESOURCE_DMA,278},279};280281struct platform_device msm_device_sdc1 = {282.name = "msm_sdcc",283.id = 1,284.num_resources = ARRAY_SIZE(resources_sdc1),285.resource = resources_sdc1,286.dev = {287.coherent_dma_mask = 0xffffffff,288},289};290291struct platform_device msm_device_sdc2 = {292.name = "msm_sdcc",293.id = 2,294.num_resources = ARRAY_SIZE(resources_sdc2),295.resource = resources_sdc2,296.dev = {297.coherent_dma_mask = 0xffffffff,298},299};300301struct platform_device msm_device_sdc3 = {302.name = "msm_sdcc",303.id = 3,304.num_resources = ARRAY_SIZE(resources_sdc3),305.resource = resources_sdc3,306.dev = {307.coherent_dma_mask = 0xffffffff,308},309};310311struct platform_device msm_device_sdc4 = {312.name = "msm_sdcc",313.id = 4,314.num_resources = ARRAY_SIZE(resources_sdc4),315.resource = resources_sdc4,316.dev = {317.coherent_dma_mask = 0xffffffff,318},319};320321static struct platform_device *msm_sdcc_devices[] __initdata = {322&msm_device_sdc1,323&msm_device_sdc2,324&msm_device_sdc3,325&msm_device_sdc4,326};327328int __init msm_add_sdcc(unsigned int controller,329struct msm_mmc_platform_data *plat,330unsigned int stat_irq, unsigned long stat_irq_flags)331{332struct platform_device *pdev;333struct resource *res;334335if (controller < 1 || controller > 4)336return -EINVAL;337338pdev = msm_sdcc_devices[controller-1];339pdev->dev.platform_data = plat;340341res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "status_irq");342if (!res)343return -EINVAL;344else if (stat_irq) {345res->start = res->end = stat_irq;346res->flags &= ~IORESOURCE_DISABLED;347res->flags |= stat_irq_flags;348}349350return platform_device_register(pdev);351}352353static struct resource resources_mddi0[] = {354{355.start = MSM_PMDH_PHYS,356.end = MSM_PMDH_PHYS + MSM_PMDH_SIZE - 1,357.flags = IORESOURCE_MEM,358},359{360.start = INT_MDDI_PRI,361.end = INT_MDDI_PRI,362.flags = IORESOURCE_IRQ,363},364};365366static struct resource resources_mddi1[] = {367{368.start = MSM_EMDH_PHYS,369.end = MSM_EMDH_PHYS + MSM_EMDH_SIZE - 1,370.flags = IORESOURCE_MEM,371},372{373.start = INT_MDDI_EXT,374.end = INT_MDDI_EXT,375.flags = IORESOURCE_IRQ,376},377};378379struct platform_device msm_device_mddi0 = {380.name = "msm_mddi",381.id = 0,382.num_resources = ARRAY_SIZE(resources_mddi0),383.resource = resources_mddi0,384.dev = {385.coherent_dma_mask = 0xffffffff,386},387};388389struct platform_device msm_device_mddi1 = {390.name = "msm_mddi",391.id = 1,392.num_resources = ARRAY_SIZE(resources_mddi1),393.resource = resources_mddi1,394.dev = {395.coherent_dma_mask = 0xffffffff,396},397};398399static struct resource resources_mdp[] = {400{401.start = MSM_MDP_PHYS,402.end = MSM_MDP_PHYS + MSM_MDP_SIZE - 1,403.name = "mdp",404.flags = IORESOURCE_MEM405},406{407.start = INT_MDP,408.end = INT_MDP,409.flags = IORESOURCE_IRQ,410},411};412413struct platform_device msm_device_mdp = {414.name = "msm_mdp",415.id = 0,416.num_resources = ARRAY_SIZE(resources_mdp),417.resource = resources_mdp,418};419420struct clk_lookup msm_clocks_7x01a[] = {421CLK_PCOM("adm_clk", ADM_CLK, NULL, 0),422CLK_PCOM("adsp_clk", ADSP_CLK, NULL, 0),423CLK_PCOM("ebi1_clk", EBI1_CLK, NULL, 0),424CLK_PCOM("ebi2_clk", EBI2_CLK, NULL, 0),425CLK_PCOM("ecodec_clk", ECODEC_CLK, NULL, 0),426CLK_PCOM("emdh_clk", EMDH_CLK, NULL, OFF),427CLK_PCOM("gp_clk", GP_CLK, NULL, 0),428CLK_PCOM("grp_clk", GRP_3D_CLK, NULL, OFF),429CLK_PCOM("i2c_clk", I2C_CLK, "msm_i2c.0", 0),430CLK_PCOM("icodec_rx_clk", ICODEC_RX_CLK, NULL, 0),431CLK_PCOM("icodec_tx_clk", ICODEC_TX_CLK, NULL, 0),432CLK_PCOM("imem_clk", IMEM_CLK, NULL, OFF),433CLK_PCOM("mdc_clk", MDC_CLK, NULL, 0),434CLK_PCOM("mdp_clk", MDP_CLK, NULL, OFF),435CLK_PCOM("pbus_clk", PBUS_CLK, NULL, 0),436CLK_PCOM("pcm_clk", PCM_CLK, NULL, 0),437CLK_PCOM("mddi_clk", PMDH_CLK, NULL, OFF | CLK_MINMAX),438CLK_PCOM("sdac_clk", SDAC_CLK, NULL, OFF),439CLK_PCOM("sdc_clk", SDC1_CLK, "msm_sdcc.1", OFF),440CLK_PCOM("sdc_pclk", SDC1_P_CLK, "msm_sdcc.1", OFF),441CLK_PCOM("sdc_clk", SDC2_CLK, "msm_sdcc.2", OFF),442CLK_PCOM("sdc_pclk", SDC2_P_CLK, "msm_sdcc.2", OFF),443CLK_PCOM("sdc_clk", SDC3_CLK, "msm_sdcc.3", OFF),444CLK_PCOM("sdc_pclk", SDC3_P_CLK, "msm_sdcc.3", OFF),445CLK_PCOM("sdc_clk", SDC4_CLK, "msm_sdcc.4", OFF),446CLK_PCOM("sdc_pclk", SDC4_P_CLK, "msm_sdcc.4", OFF),447CLK_PCOM("tsif_clk", TSIF_CLK, NULL, 0),448CLK_PCOM("tsif_ref_clk", TSIF_REF_CLK, NULL, 0),449CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0),450CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0),451CLK_PCOM("uart_clk", UART1_CLK, "msm_serial.0", OFF),452CLK_PCOM("uart_clk", UART2_CLK, "msm_serial.1", 0),453CLK_PCOM("uart_clk", UART3_CLK, "msm_serial.2", OFF),454CLK_PCOM("uart1dm_clk", UART1DM_CLK, NULL, OFF),455CLK_PCOM("uart2dm_clk", UART2DM_CLK, NULL, 0),456CLK_PCOM("usb_hs_clk", USB_HS_CLK, "msm_hsusb", OFF),457CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK, "msm_hsusb", OFF),458CLK_PCOM("usb_otg_clk", USB_OTG_CLK, NULL, 0),459CLK_PCOM("vdc_clk", VDC_CLK, NULL, OFF ),460CLK_PCOM("vfe_clk", VFE_CLK, NULL, OFF),461CLK_PCOM("vfe_mdc_clk", VFE_MDC_CLK, NULL, OFF),462};463464unsigned msm_num_clocks_7x01a = ARRAY_SIZE(msm_clocks_7x01a);465466467