| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 1 | /* | 
|  | 2 | * linux/arch/arm/mach-pxa/imote2.c | 
|  | 3 | * | 
|  | 4 | * Author:	Ed C. Epp | 
|  | 5 | * Created:	Nov 05, 2002 | 
|  | 6 | * Copyright:	Intel Corp. | 
|  | 7 | * | 
|  | 8 | * Modified 2008:  Jonathan Cameron | 
|  | 9 | * | 
|  | 10 | * The Imote2 is a wireless sensor node platform sold | 
|  | 11 | * by Crossbow (www.xbow.com). | 
|  | 12 | */ | 
|  | 13 |  | 
|  | 14 | #include <linux/init.h> | 
|  | 15 | #include <linux/device.h> | 
|  | 16 | #include <linux/mtd/mtd.h> | 
|  | 17 | #include <linux/mtd/partitions.h> | 
|  | 18 | #include <linux/platform_device.h> | 
|  | 19 | #include <linux/regulator/machine.h> | 
|  | 20 | #include <linux/gpio.h> | 
|  | 21 | #include <linux/leds.h> | 
|  | 22 | #include <linux/spi/spi.h> | 
|  | 23 | #include <linux/i2c.h> | 
|  | 24 | #include <linux/mfd/da903x.h> | 
| Jonathan Cameron | a252084 | 2009-05-25 16:50:12 +0000 | [diff] [blame] | 25 | #include <linux/sht15.h> | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 26 |  | 
|  | 27 | #include <asm/mach-types.h> | 
|  | 28 | #include <asm/mach/arch.h> | 
|  | 29 | #include <asm/mach/map.h> | 
|  | 30 | #include <asm/mach/flash.h> | 
|  | 31 |  | 
| Eric Miao | 51c6298 | 2009-01-02 23:17:22 +0800 | [diff] [blame] | 32 | #include <mach/pxa27x.h> | 
| Eric Miao | f0a8370 | 2009-04-13 15:03:11 +0800 | [diff] [blame] | 33 | #include <plat/i2c.h> | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 34 | #include <mach/udc.h> | 
|  | 35 | #include <mach/mmc.h> | 
|  | 36 | #include <mach/pxa2xx_spi.h> | 
|  | 37 | #include <mach/pxa27x-udc.h> | 
|  | 38 |  | 
|  | 39 | #include "devices.h" | 
|  | 40 | #include "generic.h" | 
|  | 41 |  | 
|  | 42 | static unsigned long imote2_pin_config[] __initdata = { | 
|  | 43 |  | 
|  | 44 | /* Device Identification for wakeup*/ | 
|  | 45 | GPIO102_GPIO, | 
|  | 46 |  | 
|  | 47 | /* Button */ | 
|  | 48 | GPIO91_GPIO, | 
|  | 49 |  | 
|  | 50 | /* DA9030 */ | 
|  | 51 | GPIO1_GPIO, | 
|  | 52 |  | 
|  | 53 | /* MMC */ | 
|  | 54 | GPIO32_MMC_CLK, | 
|  | 55 | GPIO112_MMC_CMD, | 
|  | 56 | GPIO92_MMC_DAT_0, | 
|  | 57 | GPIO109_MMC_DAT_1, | 
|  | 58 | GPIO110_MMC_DAT_2, | 
|  | 59 | GPIO111_MMC_DAT_3, | 
|  | 60 |  | 
|  | 61 | /* 802.15.4 radio - driver out of mainline */ | 
|  | 62 | GPIO22_GPIO,			/* CC_RSTN */ | 
|  | 63 | GPIO114_GPIO,			/* CC_FIFO */ | 
|  | 64 | GPIO116_GPIO,			/* CC_CCA */ | 
|  | 65 | GPIO0_GPIO,			/* CC_FIFOP */ | 
|  | 66 | GPIO16_GPIO,			/* CCSFD */ | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 67 | GPIO115_GPIO,			/* Power enable */ | 
|  | 68 |  | 
|  | 69 | /* I2C */ | 
|  | 70 | GPIO117_I2C_SCL, | 
|  | 71 | GPIO118_I2C_SDA, | 
|  | 72 |  | 
|  | 73 | /* SSP 3 - 802.15.4 radio */ | 
| Stefan Schmidt | 0925e2f | 2010-02-13 21:59:32 +0100 | [diff] [blame] | 74 | GPIO39_GPIO,			/* Chip Select */ | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 75 | GPIO34_SSP3_SCLK, | 
|  | 76 | GPIO35_SSP3_TXD, | 
|  | 77 | GPIO41_SSP3_RXD, | 
|  | 78 |  | 
|  | 79 | /* SSP 2 - to daughter boards */ | 
|  | 80 | GPIO37_GPIO,			/* Chip Select */ | 
|  | 81 | GPIO36_SSP2_SCLK, | 
|  | 82 | GPIO38_SSP2_TXD, | 
|  | 83 | GPIO11_SSP2_RXD, | 
|  | 84 |  | 
|  | 85 | /* SSP 1 - to daughter boards */ | 
|  | 86 | GPIO24_GPIO,			/* Chip Select */ | 
|  | 87 | GPIO23_SSP1_SCLK, | 
|  | 88 | GPIO25_SSP1_TXD, | 
|  | 89 | GPIO26_SSP1_RXD, | 
|  | 90 |  | 
|  | 91 | /* BTUART Basic Connector*/ | 
|  | 92 | GPIO42_BTUART_RXD, | 
|  | 93 | GPIO43_BTUART_TXD, | 
|  | 94 | GPIO44_BTUART_CTS, | 
|  | 95 | GPIO45_BTUART_RTS, | 
|  | 96 |  | 
|  | 97 | /* STUART Serial console via debug board*/ | 
|  | 98 | GPIO46_STUART_RXD, | 
|  | 99 | GPIO47_STUART_TXD, | 
|  | 100 |  | 
|  | 101 | /* Basic sensor board */ | 
|  | 102 | GPIO96_GPIO,	/* accelerometer interrupt */ | 
|  | 103 | GPIO99_GPIO,	/* ADC interrupt */ | 
|  | 104 |  | 
| Jonathan Cameron | a252084 | 2009-05-25 16:50:12 +0000 | [diff] [blame] | 105 | /* SHT15 */ | 
|  | 106 | GPIO100_GPIO, | 
|  | 107 | GPIO98_GPIO, | 
|  | 108 |  | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 109 | /* Connector pins specified as gpios */ | 
|  | 110 | GPIO94_GPIO, /* large basic connector pin 14 */ | 
|  | 111 | GPIO10_GPIO, /* large basic connector pin 23 */ | 
|  | 112 |  | 
|  | 113 | /* LEDS */ | 
|  | 114 | GPIO103_GPIO, /* red led */ | 
|  | 115 | GPIO104_GPIO, /* green led */ | 
|  | 116 | GPIO105_GPIO, /* blue led */ | 
|  | 117 | }; | 
|  | 118 |  | 
| Jonathan Cameron | a252084 | 2009-05-25 16:50:12 +0000 | [diff] [blame] | 119 | static struct sht15_platform_data platform_data_sht15 = { | 
|  | 120 | .gpio_data =  100, | 
|  | 121 | .gpio_sck  =  98, | 
|  | 122 | }; | 
|  | 123 |  | 
|  | 124 | static struct platform_device sht15 = { | 
|  | 125 | .name = "sht15", | 
|  | 126 | .id = -1, | 
|  | 127 | .dev = { | 
|  | 128 | .platform_data = &platform_data_sht15, | 
|  | 129 | }, | 
|  | 130 | }; | 
|  | 131 |  | 
|  | 132 | static struct regulator_consumer_supply imote2_sensor_3_con[] = { | 
|  | 133 | { | 
|  | 134 | .dev = &sht15.dev, | 
|  | 135 | .supply = "vcc", | 
|  | 136 | }, | 
|  | 137 | }; | 
|  | 138 |  | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 139 | static struct gpio_led imote2_led_pins[] = { | 
|  | 140 | { | 
|  | 141 | .name       =  "imote2:red", | 
|  | 142 | .gpio       = 103, | 
|  | 143 | .active_low = 1, | 
|  | 144 | }, { | 
|  | 145 | .name       = "imote2:green", | 
|  | 146 | .gpio       = 104, | 
|  | 147 | .active_low = 1, | 
|  | 148 | }, { | 
|  | 149 | .name       = "imote2:blue", | 
|  | 150 | .gpio       = 105, | 
|  | 151 | .active_low = 1, | 
|  | 152 | }, | 
|  | 153 | }; | 
|  | 154 |  | 
|  | 155 | static struct gpio_led_platform_data imote2_led_data = { | 
|  | 156 | .num_leds = ARRAY_SIZE(imote2_led_pins), | 
|  | 157 | .leds     = imote2_led_pins, | 
|  | 158 | }; | 
|  | 159 |  | 
|  | 160 | static struct platform_device imote2_leds = { | 
|  | 161 | .name = "leds-gpio", | 
|  | 162 | .id   = -1, | 
|  | 163 | .dev = { | 
|  | 164 | .platform_data = &imote2_led_data, | 
|  | 165 | }, | 
|  | 166 | }; | 
|  | 167 |  | 
|  | 168 | /* Reverse engineered partly from Platformx drivers */ | 
|  | 169 | enum imote2_ldos{ | 
|  | 170 | vcc_vref, | 
|  | 171 | vcc_cc2420, | 
|  | 172 | vcc_mica, | 
|  | 173 | vcc_bt, | 
|  | 174 | /* The two voltages available to sensor boards */ | 
|  | 175 | vcc_sensor_1_8, | 
|  | 176 | vcc_sensor_3, | 
|  | 177 |  | 
|  | 178 | vcc_sram_ext, /* directly connected to the pxa271 */ | 
|  | 179 | vcc_pxa_pll, | 
|  | 180 | vcc_pxa_usim, /* Reference voltage for certain gpios */ | 
|  | 181 | vcc_pxa_mem, | 
|  | 182 | vcc_pxa_flash, | 
|  | 183 | vcc_pxa_core, /*Dc-Dc buck not yet supported */ | 
|  | 184 | vcc_lcd, | 
|  | 185 | vcc_bb, | 
|  | 186 | vcc_bbio, | 
|  | 187 | vcc_io, /* cc2420 802.15.4 radio and pxa vcc_io ?*/ | 
|  | 188 | }; | 
|  | 189 |  | 
|  | 190 | /* The values of the various regulator constraints are obviously dependent | 
|  | 191 | * on exactly what is wired to each ldo.  Unfortunately this information is | 
|  | 192 | * not generally available.  More information has been requested from Xbow | 
|  | 193 | * but as of yet they haven't been forthcoming. | 
|  | 194 | * | 
|  | 195 | * Some of these are clearly Stargate 2 related (no way of plugging | 
|  | 196 | * in an lcd on the IM2 for example!). | 
|  | 197 | */ | 
|  | 198 | static struct regulator_init_data imote2_ldo_init_data[] = { | 
|  | 199 | [vcc_bbio] = { | 
|  | 200 | .constraints = { /* board default 1.8V */ | 
|  | 201 | .name = "vcc_bbio", | 
|  | 202 | .min_uV = 1800000, | 
|  | 203 | .max_uV = 1800000, | 
|  | 204 | }, | 
|  | 205 | }, | 
|  | 206 | [vcc_bb] = { | 
|  | 207 | .constraints = { /* board default 2.8V */ | 
|  | 208 | .name = "vcc_bb", | 
|  | 209 | .min_uV = 2700000, | 
|  | 210 | .max_uV = 3000000, | 
|  | 211 | }, | 
|  | 212 | }, | 
|  | 213 | [vcc_pxa_flash] = { | 
|  | 214 | .constraints = {/* default is 1.8V */ | 
|  | 215 | .name = "vcc_pxa_flash", | 
|  | 216 | .min_uV = 1800000, | 
|  | 217 | .max_uV = 1800000, | 
|  | 218 | }, | 
|  | 219 | }, | 
|  | 220 | [vcc_cc2420] = { /* also vcc_io */ | 
|  | 221 | .constraints = { | 
|  | 222 | /* board default is 2.8V */ | 
|  | 223 | .name = "vcc_cc2420", | 
|  | 224 | .min_uV = 2700000, | 
|  | 225 | .max_uV = 3300000, | 
|  | 226 | }, | 
|  | 227 | }, | 
|  | 228 | [vcc_vref] = { /* Reference for what? */ | 
|  | 229 | .constraints = { /* default 1.8V */ | 
|  | 230 | .name = "vcc_vref", | 
|  | 231 | .min_uV = 1800000, | 
|  | 232 | .max_uV = 1800000, | 
|  | 233 | }, | 
|  | 234 | }, | 
|  | 235 | [vcc_sram_ext] = { | 
|  | 236 | .constraints = { /* default 2.8V */ | 
|  | 237 | .name = "vcc_sram_ext", | 
|  | 238 | .min_uV = 2800000, | 
|  | 239 | .max_uV = 2800000, | 
|  | 240 | }, | 
|  | 241 | }, | 
|  | 242 | [vcc_mica] = { | 
|  | 243 | .constraints = { /* default 2.8V */ | 
|  | 244 | .name = "vcc_mica", | 
|  | 245 | .min_uV = 2800000, | 
|  | 246 | .max_uV = 2800000, | 
|  | 247 | }, | 
|  | 248 | }, | 
|  | 249 | [vcc_bt] = { | 
|  | 250 | .constraints = { /* default 2.8V */ | 
|  | 251 | .name = "vcc_bt", | 
|  | 252 | .min_uV = 2800000, | 
|  | 253 | .max_uV = 2800000, | 
|  | 254 | }, | 
|  | 255 | }, | 
|  | 256 | [vcc_lcd] = { | 
|  | 257 | .constraints = { /* default 2.8V */ | 
|  | 258 | .name = "vcc_lcd", | 
|  | 259 | .min_uV = 2700000, | 
|  | 260 | .max_uV = 3300000, | 
|  | 261 | }, | 
|  | 262 | }, | 
|  | 263 | [vcc_io] = { /* Same or higher than everything | 
|  | 264 | * bar vccbat and vccusb */ | 
|  | 265 | .constraints = { /* default 2.8V */ | 
|  | 266 | .name = "vcc_io", | 
|  | 267 | .min_uV = 2692000, | 
|  | 268 | .max_uV = 3300000, | 
|  | 269 | }, | 
|  | 270 | }, | 
|  | 271 | [vcc_sensor_1_8] = { | 
|  | 272 | .constraints = { /* default 1.8V */ | 
|  | 273 | .name = "vcc_sensor_1_8", | 
|  | 274 | .min_uV = 1800000, | 
|  | 275 | .max_uV = 1800000, | 
|  | 276 | }, | 
|  | 277 | }, | 
|  | 278 | [vcc_sensor_3] = { /* curiously default 2.8V */ | 
|  | 279 | .constraints = { | 
|  | 280 | .name = "vcc_sensor_3", | 
|  | 281 | .min_uV = 2800000, | 
|  | 282 | .max_uV = 3000000, | 
|  | 283 | }, | 
| Jonathan Cameron | a252084 | 2009-05-25 16:50:12 +0000 | [diff] [blame] | 284 | .num_consumer_supplies = ARRAY_SIZE(imote2_sensor_3_con), | 
|  | 285 | .consumer_supplies = imote2_sensor_3_con, | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 286 | }, | 
|  | 287 | [vcc_pxa_pll] = { /* 1.17V - 1.43V, default 1.3V*/ | 
|  | 288 | .constraints = { | 
|  | 289 | .name = "vcc_pxa_pll", | 
|  | 290 | .min_uV = 1170000, | 
|  | 291 | .max_uV = 1430000, | 
|  | 292 | }, | 
|  | 293 | }, | 
|  | 294 | [vcc_pxa_usim] = { | 
|  | 295 | .constraints = { /* default 1.8V */ | 
|  | 296 | .name = "vcc_pxa_usim", | 
|  | 297 | .min_uV = 1710000, | 
|  | 298 | .max_uV = 2160000, | 
|  | 299 | }, | 
|  | 300 | }, | 
|  | 301 | [vcc_pxa_mem] = { | 
|  | 302 | .constraints = { /* default 1.8V */ | 
|  | 303 | .name = "vcc_pxa_mem", | 
|  | 304 | .min_uV = 1800000, | 
|  | 305 | .max_uV = 1800000, | 
|  | 306 | }, | 
|  | 307 | }, | 
|  | 308 | }; | 
|  | 309 |  | 
|  | 310 | static struct da903x_subdev_info imote2_da9030_subdevs[] = { | 
|  | 311 | { | 
|  | 312 | .name = "da903x-regulator", | 
|  | 313 | .id = DA9030_ID_LDO2, | 
|  | 314 | .platform_data = &imote2_ldo_init_data[vcc_bbio], | 
|  | 315 | }, { | 
|  | 316 | .name = "da903x-regulator", | 
|  | 317 | .id = DA9030_ID_LDO3, | 
|  | 318 | .platform_data = &imote2_ldo_init_data[vcc_bb], | 
|  | 319 | }, { | 
|  | 320 | .name = "da903x-regulator", | 
|  | 321 | .id = DA9030_ID_LDO4, | 
|  | 322 | .platform_data = &imote2_ldo_init_data[vcc_pxa_flash], | 
|  | 323 | }, { | 
|  | 324 | .name = "da903x-regulator", | 
|  | 325 | .id = DA9030_ID_LDO5, | 
|  | 326 | .platform_data = &imote2_ldo_init_data[vcc_cc2420], | 
|  | 327 | }, { | 
|  | 328 | .name = "da903x-regulator", | 
|  | 329 | .id = DA9030_ID_LDO6, | 
|  | 330 | .platform_data = &imote2_ldo_init_data[vcc_vref], | 
|  | 331 | }, { | 
|  | 332 | .name = "da903x-regulator", | 
|  | 333 | .id = DA9030_ID_LDO7, | 
|  | 334 | .platform_data = &imote2_ldo_init_data[vcc_sram_ext], | 
|  | 335 | }, { | 
|  | 336 | .name = "da903x-regulator", | 
|  | 337 | .id = DA9030_ID_LDO8, | 
|  | 338 | .platform_data = &imote2_ldo_init_data[vcc_mica], | 
|  | 339 | }, { | 
|  | 340 | .name = "da903x-regulator", | 
|  | 341 | .id = DA9030_ID_LDO9, | 
|  | 342 | .platform_data = &imote2_ldo_init_data[vcc_bt], | 
|  | 343 | }, { | 
|  | 344 | .name = "da903x-regulator", | 
|  | 345 | .id = DA9030_ID_LDO10, | 
|  | 346 | .platform_data = &imote2_ldo_init_data[vcc_sensor_1_8], | 
|  | 347 | }, { | 
|  | 348 | .name = "da903x-regulator", | 
|  | 349 | .id = DA9030_ID_LDO11, | 
|  | 350 | .platform_data = &imote2_ldo_init_data[vcc_sensor_3], | 
|  | 351 | }, { | 
|  | 352 | .name = "da903x-regulator", | 
|  | 353 | .id = DA9030_ID_LDO12, | 
|  | 354 | .platform_data = &imote2_ldo_init_data[vcc_lcd], | 
|  | 355 | }, { | 
|  | 356 | .name = "da903x-regulator", | 
|  | 357 | .id = DA9030_ID_LDO15, | 
|  | 358 | .platform_data = &imote2_ldo_init_data[vcc_pxa_pll], | 
|  | 359 | }, { | 
|  | 360 | .name = "da903x-regulator", | 
|  | 361 | .id = DA9030_ID_LDO17, | 
|  | 362 | .platform_data = &imote2_ldo_init_data[vcc_pxa_usim], | 
|  | 363 | }, { | 
|  | 364 | .name = "da903x-regulator", | 
|  | 365 | .id = DA9030_ID_LDO18, | 
|  | 366 | .platform_data = &imote2_ldo_init_data[vcc_io], | 
|  | 367 | }, { | 
|  | 368 | .name = "da903x-regulator", | 
|  | 369 | .id = DA9030_ID_LDO19, | 
|  | 370 | .platform_data = &imote2_ldo_init_data[vcc_pxa_mem], | 
|  | 371 | }, | 
|  | 372 | }; | 
|  | 373 |  | 
|  | 374 | static struct da903x_platform_data imote2_da9030_pdata = { | 
|  | 375 | .num_subdevs = ARRAY_SIZE(imote2_da9030_subdevs), | 
|  | 376 | .subdevs = imote2_da9030_subdevs, | 
|  | 377 | }; | 
|  | 378 |  | 
|  | 379 | /* As the the imote2 doesn't currently have a conventional SD slot | 
|  | 380 | * there is no option to hotplug cards, making all this rather simple | 
|  | 381 | */ | 
|  | 382 | static int imote2_mci_get_ro(struct device *dev) | 
|  | 383 | { | 
|  | 384 | return 0; | 
|  | 385 | } | 
|  | 386 |  | 
|  | 387 | /* Rather simple case as hotplugging not possible */ | 
|  | 388 | static struct pxamci_platform_data imote2_mci_platform_data = { | 
|  | 389 | .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* default anyway */ | 
|  | 390 | .get_ro = imote2_mci_get_ro, | 
| Robert Jarzmik | 7a64825 | 2009-07-06 22:16:42 +0200 | [diff] [blame] | 391 | .gpio_card_detect = -1, | 
|  | 392 | .gpio_card_ro	= -1, | 
|  | 393 | .gpio_power = -1, | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 394 | }; | 
|  | 395 |  | 
|  | 396 | static struct mtd_partition imote2flash_partitions[] = { | 
|  | 397 | { | 
|  | 398 | .name = "Bootloader", | 
|  | 399 | .size = 0x00040000, | 
|  | 400 | .offset = 0, | 
|  | 401 | .mask_flags = MTD_WRITEABLE, | 
|  | 402 | }, { | 
|  | 403 | .name = "Kernel", | 
|  | 404 | .size = 0x00200000, | 
|  | 405 | .offset = 0x00040000, | 
|  | 406 | .mask_flags = 0, | 
|  | 407 | }, { | 
|  | 408 | .name = "Filesystem", | 
|  | 409 | .size = 0x01DC0000, | 
|  | 410 | .offset = 0x00240000, | 
|  | 411 | .mask_flags = 0, | 
|  | 412 | }, | 
|  | 413 | }; | 
|  | 414 |  | 
|  | 415 | static struct resource flash_resources = { | 
|  | 416 | .start = PXA_CS0_PHYS, | 
|  | 417 | .end = PXA_CS0_PHYS + SZ_32M - 1, | 
|  | 418 | .flags = IORESOURCE_MEM, | 
|  | 419 | }; | 
|  | 420 |  | 
|  | 421 | static struct flash_platform_data imote2_flash_data = { | 
|  | 422 | .map_name = "cfi_probe", | 
|  | 423 | .parts = imote2flash_partitions, | 
|  | 424 | .nr_parts = ARRAY_SIZE(imote2flash_partitions), | 
|  | 425 | .name = "PXA27xOnChipROM", | 
|  | 426 | .width = 2, | 
|  | 427 | }; | 
|  | 428 |  | 
|  | 429 | static struct platform_device imote2_flash_device = { | 
|  | 430 | .name = "pxa2xx-flash", | 
|  | 431 | .id = 0, | 
|  | 432 | .dev = { | 
|  | 433 | .platform_data = &imote2_flash_data, | 
|  | 434 | }, | 
|  | 435 | .resource = &flash_resources, | 
|  | 436 | .num_resources = 1, | 
|  | 437 | }; | 
|  | 438 |  | 
|  | 439 | /* Some of the drivers here are out of kernel at the moment (parts of IIO) | 
|  | 440 | * and it may be a while before they are in the mainline. | 
|  | 441 | */ | 
|  | 442 | static struct i2c_board_info __initdata imote2_i2c_board_info[] = { | 
|  | 443 | { /* UCAM sensor board */ | 
| Jonathan Cameron | d81e77f | 2009-05-25 16:50:10 +0000 | [diff] [blame] | 444 | .type = "max1239", | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 445 | .addr = 0x35, | 
|  | 446 | }, { /* ITS400 Sensor board only */ | 
|  | 447 | .type = "max1363", | 
|  | 448 | .addr = 0x34, | 
|  | 449 | /* Through a nand gate - Also beware, on V2 sensor board the | 
|  | 450 | * pull up resistors are missing. | 
|  | 451 | */ | 
|  | 452 | .irq = IRQ_GPIO(99), | 
|  | 453 | }, { /* ITS400 Sensor board only */ | 
|  | 454 | .type = "tsl2561", | 
|  | 455 | .addr = 0x49, | 
|  | 456 | /* Through a nand gate - Also beware, on V2 sensor board the | 
|  | 457 | * pull up resistors are missing. | 
|  | 458 | */ | 
|  | 459 | .irq = IRQ_GPIO(99), | 
|  | 460 | }, { /* ITS400 Sensor board only */ | 
|  | 461 | .type = "tmp175", | 
|  | 462 | .addr = 0x4A, | 
|  | 463 | .irq = IRQ_GPIO(96), | 
| Jonathan Cameron | 0a0ca89 | 2009-05-25 16:50:14 +0000 | [diff] [blame] | 464 | }, { /* IMB400 Multimedia board */ | 
|  | 465 | .type = "wm8940", | 
|  | 466 | .addr = 0x1A, | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 467 | }, | 
|  | 468 | }; | 
|  | 469 |  | 
|  | 470 | static struct i2c_board_info __initdata imote2_pwr_i2c_board_info[] = { | 
|  | 471 | { | 
|  | 472 | .type = "da9030", | 
|  | 473 | .addr = 0x49, | 
|  | 474 | .platform_data = &imote2_da9030_pdata, | 
|  | 475 | .irq = gpio_to_irq(1), | 
|  | 476 | }, | 
|  | 477 | }; | 
|  | 478 |  | 
|  | 479 | static struct pxa2xx_spi_master pxa_ssp_master_0_info = { | 
|  | 480 | .num_chipselect = 1, | 
|  | 481 | }; | 
|  | 482 |  | 
|  | 483 | static struct pxa2xx_spi_master pxa_ssp_master_1_info = { | 
|  | 484 | .num_chipselect = 1, | 
|  | 485 | }; | 
|  | 486 |  | 
|  | 487 | static struct pxa2xx_spi_master pxa_ssp_master_2_info = { | 
|  | 488 | .num_chipselect = 1, | 
|  | 489 | }; | 
|  | 490 |  | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 491 | static struct pxa2xx_spi_chip staccel_chip_info = { | 
|  | 492 | .tx_threshold = 8, | 
|  | 493 | .rx_threshold = 8, | 
|  | 494 | .dma_burst_size = 8, | 
|  | 495 | .timeout = 235, | 
| Mike Rapoport | 46580c0 | 2009-04-14 08:33:49 +0300 | [diff] [blame] | 496 | .gpio_cs = 24, | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 497 | }; | 
|  | 498 |  | 
|  | 499 | static struct pxa2xx_spi_chip cc2420_info = { | 
|  | 500 | .tx_threshold = 8, | 
|  | 501 | .rx_threshold = 8, | 
|  | 502 | .dma_burst_size = 8, | 
|  | 503 | .timeout = 235, | 
| Mike Rapoport | 46580c0 | 2009-04-14 08:33:49 +0300 | [diff] [blame] | 504 | .gpio_cs = 39, | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 505 | }; | 
|  | 506 |  | 
|  | 507 | static struct spi_board_info spi_board_info[] __initdata = { | 
|  | 508 | { /* Driver in IIO */ | 
|  | 509 | .modalias = "lis3l02dq", | 
|  | 510 | .max_speed_hz = 8000000,/* 8MHz max spi frequency at 3V */ | 
|  | 511 | .bus_num = 1, | 
|  | 512 | .chip_select = 0, | 
|  | 513 | .controller_data = &staccel_chip_info, | 
|  | 514 | .irq = IRQ_GPIO(96), | 
|  | 515 | }, { /* Driver out of kernel as it needs considerable rewriting */ | 
|  | 516 | .modalias = "cc2420", | 
|  | 517 | .max_speed_hz = 6500000, | 
|  | 518 | .bus_num = 3, | 
|  | 519 | .chip_select = 0, | 
|  | 520 | .controller_data = &cc2420_info, | 
|  | 521 | }, | 
|  | 522 | }; | 
|  | 523 |  | 
|  | 524 | static void im2_udc_command(int cmd) | 
|  | 525 | { | 
|  | 526 | switch (cmd) { | 
|  | 527 | case PXA2XX_UDC_CMD_CONNECT: | 
|  | 528 | UP2OCR |=  UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE; | 
|  | 529 | break; | 
|  | 530 | case PXA2XX_UDC_CMD_DISCONNECT: | 
|  | 531 | UP2OCR &= ~(UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE); | 
|  | 532 | break; | 
|  | 533 | } | 
|  | 534 | } | 
|  | 535 |  | 
|  | 536 | static struct pxa2xx_udc_mach_info imote2_udc_info __initdata = { | 
|  | 537 | .udc_command		= im2_udc_command, | 
|  | 538 | }; | 
|  | 539 |  | 
|  | 540 | static struct platform_device *imote2_devices[] = { | 
|  | 541 | &imote2_flash_device, | 
|  | 542 | &imote2_leds, | 
| Jonathan Cameron | a252084 | 2009-05-25 16:50:12 +0000 | [diff] [blame] | 543 | &sht15, | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 544 | }; | 
|  | 545 |  | 
|  | 546 | static struct i2c_pxa_platform_data i2c_pwr_pdata = { | 
|  | 547 | .fast_mode = 1, | 
|  | 548 | }; | 
|  | 549 |  | 
|  | 550 | static struct i2c_pxa_platform_data i2c_pdata = { | 
|  | 551 | .fast_mode = 1, | 
|  | 552 | }; | 
|  | 553 |  | 
|  | 554 | static void __init imote2_init(void) | 
|  | 555 | { | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 556 | pxa2xx_mfp_config(ARRAY_AND_SIZE(imote2_pin_config)); | 
| Russell King | cc155c6 | 2009-11-09 13:34:08 +0800 | [diff] [blame] | 557 |  | 
|  | 558 | pxa_set_ffuart_info(NULL); | 
|  | 559 | pxa_set_btuart_info(NULL); | 
|  | 560 | pxa_set_stuart_info(NULL); | 
|  | 561 |  | 
| Jonathan Cameron | b6795fa | 2008-12-12 20:43:09 +0000 | [diff] [blame] | 562 | platform_add_devices(imote2_devices, ARRAY_SIZE(imote2_devices)); | 
|  | 563 |  | 
|  | 564 | pxa2xx_set_spi_info(1, &pxa_ssp_master_0_info); | 
|  | 565 | pxa2xx_set_spi_info(2, &pxa_ssp_master_1_info); | 
|  | 566 | pxa2xx_set_spi_info(3, &pxa_ssp_master_2_info); | 
|  | 567 |  | 
|  | 568 | spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info)); | 
|  | 569 |  | 
|  | 570 | i2c_register_board_info(0, imote2_i2c_board_info, | 
|  | 571 | ARRAY_SIZE(imote2_i2c_board_info)); | 
|  | 572 | i2c_register_board_info(1, imote2_pwr_i2c_board_info, | 
|  | 573 | ARRAY_SIZE(imote2_pwr_i2c_board_info)); | 
|  | 574 |  | 
|  | 575 | pxa27x_set_i2c_power_info(&i2c_pwr_pdata); | 
|  | 576 | pxa_set_i2c_info(&i2c_pdata); | 
|  | 577 |  | 
|  | 578 | pxa_set_mci_info(&imote2_mci_platform_data); | 
|  | 579 | pxa_set_udc_info(&imote2_udc_info); | 
|  | 580 | } | 
|  | 581 |  | 
|  | 582 | MACHINE_START(INTELMOTE2, "IMOTE 2") | 
|  | 583 | .phys_io	= 0x40000000, | 
|  | 584 | .io_pg_offst	= (io_p2v(0x40000000) >> 18) & 0xfffc, | 
|  | 585 | .map_io		= pxa_map_io, | 
|  | 586 | .init_irq	= pxa27x_init_irq, | 
|  | 587 | .timer		= &pxa_timer, | 
|  | 588 | .init_machine	= imote2_init, | 
|  | 589 | .boot_params	= 0xA0000100, | 
|  | 590 | MACHINE_END |