1 /* 2 * linux/arch/arm/mach-omap2/devices.c 3 * 4 * OMAP2 platform device setup/initialization 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 */ 11 #include <linux/gpio.h> 12 #include <linux/kernel.h> 13 #include <linux/init.h> 14 #include <linux/platform_device.h> 15 #include <linux/io.h> 16 #include <linux/clk.h> 17 #include <linux/err.h> 18 #include <linux/slab.h> 19 #include <linux/of.h> 20 #include <linux/pinctrl/machine.h> 21 22 #include <asm/mach-types.h> 23 #include <asm/mach/map.h> 24 25 #include <linux/omap-dma.h> 26 27 #include "iomap.h" 28 #include "omap_hwmod.h" 29 #include "omap_device.h" 30 31 #include "soc.h" 32 #include "common.h" 33 #include "mux.h" 34 #include "control.h" 35 #include "display.h" 36 37 #define L3_MODULES_MAX_LEN 12 38 #define L3_MODULES 3 39 40 static int __init omap3_l3_init(void) 41 { 42 struct omap_hwmod *oh; 43 struct platform_device *pdev; 44 char oh_name[L3_MODULES_MAX_LEN]; 45 46 /* 47 * To avoid code running on other OMAPs in 48 * multi-omap builds 49 */ 50 if (!(cpu_is_omap34xx()) || of_have_populated_dt()) 51 return -ENODEV; 52 53 snprintf(oh_name, L3_MODULES_MAX_LEN, "l3_main"); 54 55 oh = omap_hwmod_lookup(oh_name); 56 57 if (!oh) 58 pr_err("could not look up %s\n", oh_name); 59 60 pdev = omap_device_build("omap_l3_smx", 0, oh, NULL, 0); 61 62 WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); 63 64 return PTR_ERR_OR_ZERO(pdev); 65 } 66 omap_postcore_initcall(omap3_l3_init); 67 68 static inline void omap_init_sti(void) {} 69 70 #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE) 71 72 #include <linux/platform_data/spi-omap2-mcspi.h> 73 74 static int __init omap_mcspi_init(struct omap_hwmod *oh, void *unused) 75 { 76 struct platform_device *pdev; 77 char *name = "omap2_mcspi"; 78 struct omap2_mcspi_platform_config *pdata; 79 static int spi_num; 80 struct omap2_mcspi_dev_attr *mcspi_attrib = oh->dev_attr; 81 82 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); 83 if (!pdata) { 84 pr_err("Memory allocation for McSPI device failed\n"); 85 return -ENOMEM; 86 } 87 88 pdata->num_cs = mcspi_attrib->num_chipselect; 89 switch (oh->class->rev) { 90 case OMAP2_MCSPI_REV: 91 case OMAP3_MCSPI_REV: 92 pdata->regs_offset = 0; 93 break; 94 case OMAP4_MCSPI_REV: 95 pdata->regs_offset = OMAP4_MCSPI_REG_OFFSET; 96 break; 97 default: 98 pr_err("Invalid McSPI Revision value\n"); 99 kfree(pdata); 100 return -EINVAL; 101 } 102 103 spi_num++; 104 pdev = omap_device_build(name, spi_num, oh, pdata, sizeof(*pdata)); 105 WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s\n", 106 name, oh->name); 107 kfree(pdata); 108 return 0; 109 } 110 111 static void omap_init_mcspi(void) 112 { 113 omap_hwmod_for_each_by_class("mcspi", omap_mcspi_init, NULL); 114 } 115 116 #else 117 static inline void omap_init_mcspi(void) {} 118 #endif 119 120 /** 121 * omap_init_rng - bind the RNG hwmod to the RNG omap_device 122 * 123 * Bind the RNG hwmod to the RNG omap_device. No return value. 124 */ 125 static void omap_init_rng(void) 126 { 127 struct omap_hwmod *oh; 128 struct platform_device *pdev; 129 130 oh = omap_hwmod_lookup("rng"); 131 if (!oh) 132 return; 133 134 pdev = omap_device_build("omap_rng", -1, oh, NULL, 0); 135 WARN(IS_ERR(pdev), "Can't build omap_device for omap_rng\n"); 136 } 137 138 static void __init omap_init_sham(void) 139 { 140 struct omap_hwmod *oh; 141 struct platform_device *pdev; 142 143 oh = omap_hwmod_lookup("sham"); 144 if (!oh) 145 return; 146 147 pdev = omap_device_build("omap-sham", -1, oh, NULL, 0); 148 WARN(IS_ERR(pdev), "Can't build omap_device for omap-sham\n"); 149 } 150 151 static void __init omap_init_aes(void) 152 { 153 struct omap_hwmod *oh; 154 struct platform_device *pdev; 155 156 oh = omap_hwmod_lookup("aes"); 157 if (!oh) 158 return; 159 160 pdev = omap_device_build("omap-aes", -1, oh, NULL, 0); 161 WARN(IS_ERR(pdev), "Can't build omap_device for omap-aes\n"); 162 } 163 164 /*-------------------------------------------------------------------------*/ 165 166 #if defined(CONFIG_VIDEO_OMAP2_VOUT) || \ 167 defined(CONFIG_VIDEO_OMAP2_VOUT_MODULE) 168 #if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) 169 static struct resource omap_vout_resource[3 - CONFIG_FB_OMAP2_NUM_FBS] = { 170 }; 171 #else 172 static struct resource omap_vout_resource[2] = { 173 }; 174 #endif 175 176 static struct platform_device omap_vout_device = { 177 .name = "omap_vout", 178 .num_resources = ARRAY_SIZE(omap_vout_resource), 179 .resource = &omap_vout_resource[0], 180 .id = -1, 181 }; 182 183 int __init omap_init_vout(void) 184 { 185 return platform_device_register(&omap_vout_device); 186 } 187 #else 188 int __init omap_init_vout(void) { return 0; } 189 #endif 190 191 /*-------------------------------------------------------------------------*/ 192 193 static int __init omap2_init_devices(void) 194 { 195 /* Enable dummy states for those platforms without pinctrl support */ 196 if (!of_have_populated_dt()) 197 pinctrl_provide_dummies(); 198 199 /* If dtb is there, the devices will be created dynamically */ 200 if (!of_have_populated_dt()) { 201 /* 202 * please keep these calls, and their implementations above, 203 * in alphabetical order so they're easier to sort through. 204 */ 205 omap_init_mcspi(); 206 omap_init_sham(); 207 omap_init_aes(); 208 omap_init_rng(); 209 } 210 omap_init_sti(); 211 212 return 0; 213 } 214 omap_arch_initcall(omap2_init_devices); 215 216 static int __init omap_gpmc_init(void) 217 { 218 struct omap_hwmod *oh; 219 struct platform_device *pdev; 220 char *oh_name = "gpmc"; 221 222 /* 223 * if the board boots up with a populated DT, do not 224 * manually add the device from this initcall 225 */ 226 if (of_have_populated_dt()) 227 return -ENODEV; 228 229 oh = omap_hwmod_lookup(oh_name); 230 if (!oh) { 231 pr_err("Could not look up %s\n", oh_name); 232 return -ENODEV; 233 } 234 235 pdev = omap_device_build("omap-gpmc", -1, oh, NULL, 0); 236 WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); 237 238 return PTR_ERR_OR_ZERO(pdev); 239 } 240 omap_postcore_initcall(omap_gpmc_init); 241