Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'boards' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc

Pull "ARM: board specific updates" from Arnd Bergmann/Olof Johansson:
"These changes are all specific to one board only. We're trying to
keep the number of board files low, but generally board level updates
are ok on platforms that are working on moving towards DT based
probing, which will eventually lead to removing them.

The board-ams-delta.c board file gets a conflict between the removal
of ams_delta_config and the addition of a lot of other data. The
Kconfig file has two changes in the same line, and in exynos, the
power domain cleanup conflicts with the addition of the image sensor
device.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
[olof: Amended a fix for a mismerge to board-omap4panda.c]
Signed-off-by: Olof Johansson <olof@lixom.net>"

Fixed up some fairly trivial conflicts manually.

* tag 'boards' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (82 commits)
i.MX35-PDK: Add Camera support
ARM : mx35: 3ds-board: add framebuffer device
pxa/hx4700: Remove pcmcia platform_device structure
ARM: pxa/hx4700: Reduce sleep mode battery discharge by 35%
ARM: pxa/hx4700: Remove unwanted request for GPIO105
ARM: EXYNOS: support Exynos4210-bus Devfreq driver on Nuri board
ARM: EXYNOS: Register JPEG on nuri
ARM: EXYNOS: Register JPEG on universal_c210
ARM: S5PV210: Enable JPEG on SMDKV210
ARM: S5PV210: Add JPEG board definition
ARM: EXYNOS: Enable JPEG on Origen
ARM: EXYNOS: Enable JPEG on SMDKV310
ARM: EXYNOS: Add __init attribute to universal_camera_init()
ARM: EXYNOS: Add __init attribute to nuri_camera_init()
ARM: S5PV210: Enable FIMC on SMDKC110
ARM: S5PV210: Enable FIMC on SMDKV210
ARM: S5PV210: Enable MFC on SMDKC110
ARM: S5PV210: Enable MFC on SMDKV210
ARM: EXYNOS: Enable G2D on SMDKV310
ARM: tegra: update defconfig
...

+1929 -558
+1
arch/arm/Kconfig
··· 1583 1583 int 1584 1584 default 1024 if ARCH_SHMOBILE || ARCH_TEGRA 1585 1585 default 355 if ARCH_U8500 1586 + default 264 if MACH_H4700 1586 1587 default 0 1587 1588 help 1588 1589 Maximum number of GPIOs in the system.
+25
arch/arm/boot/dts/kirkwood-dreamplug.dts
··· 1 + /dts-v1/; 2 + 3 + /include/ "kirkwood.dtsi" 4 + 5 + / { 6 + model = "Globalscale Technologies Dreamplug"; 7 + compatible = "globalscale,dreamplug-003-ds2001", "globalscale,dreamplug", "marvell,kirkwood-88f6281", "marvell,kirkwood"; 8 + 9 + memory { 10 + device_type = "memory"; 11 + reg = <0x00000000 0x20000000>; 12 + }; 13 + 14 + chosen { 15 + bootargs = "console=ttyS0,115200n8 earlyprintk"; 16 + }; 17 + 18 + serial@f1012000 { 19 + compatible = "ns16550a"; 20 + reg = <0xf1012000 0xff>; 21 + reg-shift = <2>; 22 + interrupts = <33>; 23 + clock-frequency = <200000000>; 24 + }; 25 + };
+6
arch/arm/boot/dts/kirkwood.dtsi
··· 1 + /include/ "skeleton.dtsi" 2 + 3 + / { 4 + compatible = "marvell,kirkwood"; 5 + }; 6 +
+26
arch/arm/boot/dts/tegra-paz00.dts
··· 35 35 36 36 i2c@7000d000 { 37 37 clock-frequency = <400000>; 38 + 39 + adt7461@4c { 40 + compatible = "adi,adt7461"; 41 + reg = <0x4c>; 42 + }; 38 43 }; 39 44 40 45 serial@70006000 { ··· 78 73 79 74 sdhci@c8000600 { 80 75 support-8bit; 76 + }; 77 + 78 + gpio-keys { 79 + compatible = "gpio-keys"; 80 + 81 + power { 82 + label = "Power"; 83 + gpios = <&gpio 79 1>; /* gpio PJ7, active low */ 84 + linux,code = <116>; /* KEY_POWER */ 85 + gpio-key,wakeup; 86 + }; 87 + }; 88 + 89 + gpio-leds { 90 + compatible = "gpio-leds"; 91 + 92 + wifi { 93 + label = "wifi-led"; 94 + gpios = <&gpio 24 0>; 95 + linux,default-trigger = "rfkill0"; 96 + }; 81 97 }; 82 98 };
+22 -11
arch/arm/configs/tegra_defconfig
··· 11 11 CONFIG_BLK_DEV_INITRD=y 12 12 # CONFIG_ELF_CORE is not set 13 13 CONFIG_EMBEDDED=y 14 + CONFIG_PERF_EVENTS=y 14 15 CONFIG_SLAB=y 15 16 CONFIG_MODULES=y 16 17 CONFIG_MODULE_UNLOAD=y 17 18 CONFIG_MODULE_FORCE_UNLOAD=y 18 19 # CONFIG_BLK_DEV_BSG is not set 20 + CONFIG_PARTITION_ADVANCED=y 21 + CONFIG_EFI_PARTITION=y 19 22 # CONFIG_IOSCHED_DEADLINE is not set 20 23 # CONFIG_IOSCHED_CFQ is not set 21 24 CONFIG_ARCH_TEGRA=y ··· 30 27 CONFIG_MACH_TRIMSLICE=y 31 28 CONFIG_MACH_WARIO=y 32 29 CONFIG_MACH_VENTANA=y 33 - CONFIG_TEGRA_DEBUG_UARTD=y 34 - CONFIG_ARM_ERRATA_742230=y 30 + CONFIG_TEGRA_EMC_SCALING_ENABLE=y 35 31 CONFIG_NO_HZ=y 36 32 CONFIG_HIGH_RES_TIMERS=y 37 33 CONFIG_SMP=y 38 - CONFIG_NR_CPUS=2 39 34 CONFIG_PREEMPT=y 40 35 CONFIG_AEABI=y 41 36 # CONFIG_OABI_COMPAT is not set 42 37 CONFIG_HIGHMEM=y 43 38 CONFIG_ZBOOT_ROM_TEXT=0x0 44 39 CONFIG_ZBOOT_ROM_BSS=0x0 40 + CONFIG_AUTO_ZRELADDR=y 41 + CONFIG_CPU_FREQ=y 42 + CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y 43 + CONFIG_CPU_IDLE=y 45 44 CONFIG_VFP=y 46 45 CONFIG_NET=y 47 46 CONFIG_PACKET=y ··· 73 68 # CONFIG_FIRMWARE_IN_KERNEL is not set 74 69 CONFIG_PROC_DEVICETREE=y 75 70 CONFIG_BLK_DEV_LOOP=y 76 - CONFIG_MISC_DEVICES=y 77 71 CONFIG_AD525X_DPOT=y 78 72 CONFIG_AD525X_DPOT_I2C=y 79 73 CONFIG_ICS932S401=y ··· 80 76 CONFIG_ISL29003=y 81 77 CONFIG_SCSI=y 82 78 CONFIG_BLK_DEV_SD=y 79 + CONFIG_BLK_DEV_SR=y 83 80 # CONFIG_SCSI_LOWLEVEL is not set 84 81 CONFIG_NETDEVICES=y 85 82 CONFIG_DUMMY=y ··· 90 85 CONFIG_USB_NET_SMSC75XX=y 91 86 CONFIG_USB_NET_SMSC95XX=y 92 87 # CONFIG_WLAN is not set 93 - # CONFIG_INPUT is not set 94 - # CONFIG_SERIO is not set 88 + CONFIG_INPUT_EVDEV=y 95 89 # CONFIG_VT is not set 96 90 # CONFIG_LEGACY_PTYS is not set 97 91 # CONFIG_DEVKMEM is not set ··· 100 96 # CONFIG_HW_RANDOM is not set 101 97 CONFIG_I2C=y 102 98 # CONFIG_I2C_COMPAT is not set 103 - # CONFIG_I2C_HELPER_AUTO is not set 104 99 CONFIG_I2C_TEGRA=y 105 100 CONFIG_SPI=y 106 101 CONFIG_SPI_TEGRA=y 107 102 CONFIG_SENSORS_LM90=y 108 103 CONFIG_MFD_TPS6586X=y 109 104 CONFIG_REGULATOR=y 105 + CONFIG_REGULATOR_FIXED_VOLTAGE=y 106 + CONFIG_REGULATOR_VIRTUAL_CONSUMER=y 107 + CONFIG_REGULATOR_GPIO=y 110 108 CONFIG_REGULATOR_TPS6586X=y 111 109 CONFIG_SOUND=y 112 110 CONFIG_SND=y ··· 122 116 CONFIG_SND_SOC_TEGRA=y 123 117 CONFIG_SND_SOC_TEGRA_WM8903=y 124 118 CONFIG_SND_SOC_TEGRA_TRIMSLICE=y 119 + CONFIG_SND_SOC_TEGRA_ALC5632=y 125 120 CONFIG_USB=y 126 121 CONFIG_USB_EHCI_HCD=y 127 122 CONFIG_USB_EHCI_TEGRA=y 128 123 CONFIG_USB_STORAGE=y 129 124 CONFIG_MMC=y 125 + CONFIG_MMC_BLOCK_MINORS=16 130 126 CONFIG_MMC_SDHCI=y 131 127 CONFIG_MMC_SDHCI_PLTFM=y 132 128 CONFIG_MMC_SDHCI_TEGRA=y ··· 138 130 CONFIG_IIO=y 139 131 CONFIG_SENSORS_ISL29018=y 140 132 CONFIG_SENSORS_AK8975=y 133 + CONFIG_MFD_NVEC=y 134 + CONFIG_KEYBOARD_NVEC=y 135 + CONFIG_SERIO_NVEC_PS2=y 136 + CONFIG_TEGRA_IOMMU_GART=y 137 + CONFIG_TEGRA_IOMMU_SMMU=y 141 138 CONFIG_EXT2_FS=y 142 139 CONFIG_EXT2_FS_XATTR=y 143 140 CONFIG_EXT2_FS_POSIX_ACL=y ··· 151 138 # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set 152 139 CONFIG_EXT3_FS_POSIX_ACL=y 153 140 CONFIG_EXT3_FS_SECURITY=y 141 + CONFIG_EXT4_FS=y 154 142 # CONFIG_DNOTIFY is not set 155 143 CONFIG_VFAT_FS=y 156 144 CONFIG_TMPFS=y 157 145 CONFIG_NFS_FS=y 158 146 CONFIG_ROOT_NFS=y 159 - CONFIG_PARTITION_ADVANCED=y 160 - CONFIG_EFI_PARTITION=y 161 147 CONFIG_NLS_CODEPAGE_437=y 162 148 CONFIG_NLS_ISO8859_1=y 163 149 CONFIG_PRINTK_TIME=y ··· 174 162 CONFIG_DEBUG_LL=y 175 163 CONFIG_EARLY_PRINTK=y 176 164 CONFIG_CRYPTO_ECB=y 177 - CONFIG_CRYPTO_AES=y 178 165 CONFIG_CRYPTO_ARC4=y 179 166 CONFIG_CRYPTO_TWOFISH=y 180 167 # CONFIG_CRYPTO_ANSI_CPRNG is not set 168 + CONFIG_CRYPTO_DEV_TEGRA_AES=y 181 169 CONFIG_CRC_CCITT=y 182 - CONFIG_CRC16=y
+10
arch/arm/mach-exynos/Kconfig
··· 179 179 select S5P_DEV_FIMC1 180 180 select S5P_DEV_FIMC2 181 181 select S5P_DEV_FIMC3 182 + select S5P_DEV_G2D 182 183 select S5P_DEV_I2C_HDMIPHY 184 + select S5P_DEV_JPEG 183 185 select S5P_DEV_MFC 184 186 select S5P_DEV_TV 185 187 select S5P_DEV_USB_EHCI ··· 227 225 select S5P_DEV_FIMC1 228 226 select S5P_DEV_FIMC2 229 227 select S5P_DEV_FIMC3 228 + select S5P_DEV_G2D 230 229 select S5P_DEV_CSIS0 230 + select S5P_DEV_JPEG 231 231 select S5P_DEV_FIMD0 232 232 select S3C_DEV_HSMMC 233 233 select S3C_DEV_HSMMC2 ··· 266 262 select S3C_DEV_I2C1 267 263 select S3C_DEV_I2C3 268 264 select S3C_DEV_I2C5 265 + select S3C_DEV_I2C6 269 266 select S5P_DEV_CSIS0 267 + select S5P_DEV_JPEG 270 268 select S5P_DEV_FIMC0 271 269 select S5P_DEV_FIMC1 272 270 select S5P_DEV_FIMC2 273 271 select S5P_DEV_FIMC3 272 + select S5P_DEV_G2D 274 273 select S5P_DEV_MFC 275 274 select S5P_DEV_USB_EHCI 276 275 select S5P_SETUP_MIPIPHY ··· 283 276 select EXYNOS4_SETUP_I2C1 284 277 select EXYNOS4_SETUP_I2C3 285 278 select EXYNOS4_SETUP_I2C5 279 + select EXYNOS4_SETUP_I2C6 286 280 select EXYNOS4_SETUP_SDHCI 287 281 select EXYNOS4_SETUP_USB_PHY 288 282 select S5P_SETUP_MIPIPHY ··· 304 296 select S5P_DEV_FIMC2 305 297 select S5P_DEV_FIMC3 306 298 select S5P_DEV_FIMD0 299 + select S5P_DEV_G2D 307 300 select S5P_DEV_I2C_HDMIPHY 301 + select S5P_DEV_JPEG 308 302 select S5P_DEV_MFC 309 303 select S5P_DEV_TV 310 304 select S5P_DEV_USB_EHCI
+76 -4
arch/arm/mach-exynos/mach-nuri.c
··· 28 28 29 29 #include <video/platform_lcd.h> 30 30 #include <media/m5mols.h> 31 + #include <media/s5k6aa.h> 31 32 #include <media/s5p_fimc.h> 32 33 #include <media/v4l2-mediabus.h> 33 34 ··· 76 75 FIXED_REG_ID_MAX8903, 77 76 FIXED_REG_ID_CAM_A28V, 78 77 FIXED_REG_ID_CAM_12V, 78 + FIXED_REG_ID_CAM_VT_15V, 79 79 }; 80 80 81 81 static struct s3c2410_uartcfg nuri_uartcfgs[] __initdata = { ··· 401 399 static struct regulator_consumer_supply __initdata max8997_ldo5_[] = { 402 400 REGULATOR_SUPPLY("vhsic", "modemctl"), /* MODEM */ 403 401 }; 402 + static struct regulator_consumer_supply nuri_max8997_ldo6_consumer[] = { 403 + REGULATOR_SUPPLY("vdd_reg", "6-003c"), /* S5K6AA camera */ 404 + }; 404 405 static struct regulator_consumer_supply __initdata max8997_ldo7_[] = { 405 406 REGULATOR_SUPPLY("dig_18", "0-001f"), /* HCD803 */ 406 407 }; ··· 436 431 REGULATOR_SUPPLY("vdd_arm", NULL), /* CPUFREQ */ 437 432 }; 438 433 static struct regulator_consumer_supply __initdata max8997_buck2_[] = { 439 - REGULATOR_SUPPLY("vdd_int", NULL), /* CPUFREQ */ 434 + REGULATOR_SUPPLY("vdd_int", "exynos4210-busfreq.0"), /* CPUFREQ */ 440 435 }; 441 436 static struct regulator_consumer_supply __initdata max8997_buck3_[] = { 442 437 REGULATOR_SUPPLY("vdd", "mali_dev.0"), /* G3D of Exynos 4 */ ··· 551 546 .enabled = 1, 552 547 }, 553 548 }, 549 + .num_consumer_supplies = ARRAY_SIZE(nuri_max8997_ldo6_consumer), 550 + .consumer_supplies = nuri_max8997_ldo6_consumer, 554 551 }; 555 552 556 553 static struct regulator_init_data __initdata max8997_ldo7_data = { ··· 749 742 .constraints = { 750 743 .name = "VINT_1.1V_C210", 751 744 .min_uV = 900000, 752 - .max_uV = 1100000, 745 + .max_uV = 1200000, 753 746 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, 754 747 .always_on = 1, 755 748 .state_mem = { ··· 964 957 .regulators = nuri_max8997_regulators, 965 958 966 959 .buck125_gpios = { EXYNOS4_GPX0(5), EXYNOS4_GPX0(6), EXYNOS4_GPL0(0) }, 967 - .buck2_gpiodvs = true, 968 960 969 961 .buck1_voltage[0] = 1350000, /* 1.35V */ 970 962 .buck1_voltage[1] = 1300000, /* 1.3V */ ··· 1122 1116 } 1123 1117 1124 1118 /* CAMERA */ 1119 + static struct regulator_consumer_supply cam_vt_cam15_supply = 1120 + REGULATOR_SUPPLY("vdd_core", "6-003c"); 1121 + 1122 + static struct regulator_init_data cam_vt_cam15_reg_init_data = { 1123 + .constraints = { .valid_ops_mask = REGULATOR_CHANGE_STATUS }, 1124 + .num_consumer_supplies = 1, 1125 + .consumer_supplies = &cam_vt_cam15_supply, 1126 + }; 1127 + 1128 + static struct fixed_voltage_config cam_vt_cam15_fixed_voltage_cfg = { 1129 + .supply_name = "VT_CAM_1.5V", 1130 + .microvolts = 1500000, 1131 + .gpio = EXYNOS4_GPE2(2), /* VT_CAM_1.5V_EN */ 1132 + .enable_high = 1, 1133 + .init_data = &cam_vt_cam15_reg_init_data, 1134 + }; 1135 + 1136 + static struct platform_device cam_vt_cam15_fixed_rdev = { 1137 + .name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_VT_15V, 1138 + .dev = { .platform_data = &cam_vt_cam15_fixed_voltage_cfg }, 1139 + }; 1140 + 1125 1141 static struct regulator_consumer_supply cam_vdda_supply[] = { 1142 + REGULATOR_SUPPLY("vdda", "6-003c"), 1126 1143 REGULATOR_SUPPLY("a_sensor", "0-001f"), 1127 1144 }; 1128 1145 ··· 1202 1173 1203 1174 #define GPIO_CAM_MEGA_RST EXYNOS4_GPY3(7) /* ISP_RESET */ 1204 1175 #define GPIO_CAM_8M_ISP_INT EXYNOS4_GPL2(5) 1176 + #define GPIO_CAM_VT_NSTBY EXYNOS4_GPL2(0) 1177 + #define GPIO_CAM_VT_NRST EXYNOS4_GPL2(1) 1178 + 1179 + static struct s5k6aa_platform_data s5k6aa_pldata = { 1180 + .mclk_frequency = 24000000UL, 1181 + .gpio_reset = { GPIO_CAM_VT_NRST, 0 }, 1182 + .gpio_stby = { GPIO_CAM_VT_NSTBY, 0 }, 1183 + .bus_type = V4L2_MBUS_PARALLEL, 1184 + .horiz_flip = 1, 1185 + }; 1186 + 1187 + static struct i2c_board_info s5k6aa_board_info = { 1188 + I2C_BOARD_INFO("S5K6AA", 0x3c), 1189 + .platform_data = &s5k6aa_pldata, 1190 + }; 1205 1191 1206 1192 static struct m5mols_platform_data m5mols_platdata = { 1207 1193 .gpio_reset = GPIO_CAM_MEGA_RST, ··· 1229 1185 1230 1186 static struct s5p_fimc_isp_info nuri_camera_sensors[] = { 1231 1187 { 1188 + .flags = V4L2_MBUS_PCLK_SAMPLE_RISING | 1189 + V4L2_MBUS_VSYNC_ACTIVE_LOW, 1190 + .bus_type = FIMC_ITU_601, 1191 + .board_info = &s5k6aa_board_info, 1192 + .clk_frequency = 24000000UL, 1193 + .i2c_bus_num = 6, 1194 + }, { 1232 1195 .flags = V4L2_MBUS_PCLK_SAMPLE_FALLING | 1233 1196 V4L2_MBUS_VSYNC_ACTIVE_LOW, 1234 1197 .bus_type = FIMC_MIPI_CSI2, ··· 1251 1200 }; 1252 1201 1253 1202 static struct gpio nuri_camera_gpios[] = { 1203 + { GPIO_CAM_VT_NSTBY, GPIOF_OUT_INIT_LOW, "CAM_VGA_NSTBY" }, 1204 + { GPIO_CAM_VT_NRST, GPIOF_OUT_INIT_LOW, "CAM_VGA_NRST" }, 1254 1205 { GPIO_CAM_8M_ISP_INT, GPIOF_IN, "8M_ISP_INT" }, 1255 1206 { GPIO_CAM_MEGA_RST, GPIOF_OUT_INIT_LOW, "CAM_8M_NRST" }, 1256 1207 }; 1257 1208 1258 - static void nuri_camera_init(void) 1209 + static void __init nuri_camera_init(void) 1259 1210 { 1260 1211 s3c_set_platdata(&mipi_csis_platdata, sizeof(mipi_csis_platdata), 1261 1212 &s5p_device_mipi_csis0); ··· 1277 1224 pr_err("%s: Failed to configure 8M_ISP_INT GPIO\n", __func__); 1278 1225 1279 1226 /* Free GPIOs controlled directly by the sensor drivers. */ 1227 + gpio_free(GPIO_CAM_VT_NRST); 1228 + gpio_free(GPIO_CAM_VT_NSTBY); 1280 1229 gpio_free(GPIO_CAM_MEGA_RST); 1281 1230 1282 1231 if (exynos4_fimc_setup_gpio(S5P_CAMPORT_A)) { ··· 1289 1234 s5p_gpio_set_drvstr(EXYNOS4_GPJ1(3), S5P_GPIO_DRVSTR_LV4); 1290 1235 } 1291 1236 1237 + static struct s3c2410_platform_i2c nuri_i2c6_platdata __initdata = { 1238 + .frequency = 400000U, 1239 + .sda_delay = 200, 1240 + .bus_num = 6, 1241 + }; 1242 + 1292 1243 static struct s3c2410_platform_i2c nuri_i2c0_platdata __initdata = { 1293 1244 .frequency = 400000U, 1294 1245 .sda_delay = 200, 1246 + }; 1247 + 1248 + /* DEVFREQ controlling memory/bus */ 1249 + static struct platform_device exynos4_bus_devfreq = { 1250 + .name = "exynos4210-busfreq", 1295 1251 }; 1296 1252 1297 1253 static struct platform_device *nuri_devices[] __initdata = { 1298 1254 /* Samsung Platform Devices */ 1299 1255 &s3c_device_i2c5, /* PMIC should initialize first */ 1300 1256 &s3c_device_i2c0, 1257 + &s3c_device_i2c6, 1301 1258 &emmc_fixed_voltage, 1302 1259 &s5p_device_mipi_csis0, 1303 1260 &s5p_device_fimc0, ··· 1326 1259 &s3c_device_i2c3, 1327 1260 &i2c9_gpio, 1328 1261 &s3c_device_adc, 1262 + &s5p_device_g2d, 1263 + &s5p_device_jpeg, 1329 1264 &s3c_device_rtc, 1330 1265 &s5p_device_mfc, 1331 1266 &s5p_device_mfc_l, ··· 1340 1271 &nuri_backlight_device, 1341 1272 &max8903_fixed_reg_dev, 1342 1273 &nuri_max8903_device, 1274 + &cam_vt_cam15_fixed_rdev, 1343 1275 &cam_vdda_fixed_rdev, 1344 1276 &cam_8m_12v_fixed_rdev, 1277 + &exynos4_bus_devfreq, 1345 1278 }; 1346 1279 1347 1280 static void __init nuri_map_io(void) ··· 1373 1302 i2c_register_board_info(5, i2c5_devs, ARRAY_SIZE(i2c5_devs)); 1374 1303 i2c9_devs[I2C9_MAX17042].irq = gpio_to_irq(EXYNOS4_GPX2(3)); 1375 1304 i2c_register_board_info(9, i2c9_devs, ARRAY_SIZE(i2c9_devs)); 1305 + s3c_i2c6_set_platdata(&nuri_i2c6_platdata); 1376 1306 1377 1307 s5p_fimd0_set_platdata(&nuri_fb_pdata); 1378 1308
+37
arch/arm/mach-exynos/mach-origen.c
··· 20 20 #include <linux/regulator/machine.h> 21 21 #include <linux/mfd/max8997.h> 22 22 #include <linux/lcd.h> 23 + #include <linux/rfkill-gpio.h> 23 24 24 25 #include <asm/mach/arch.h> 25 26 #include <asm/hardware/gic.h> ··· 236 235 .min_uV = 2800000, 237 236 .max_uV = 2800000, 238 237 .apply_uV = 1, 238 + .always_on = 1, 239 239 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 240 240 .state_mem = { 241 241 .disabled = 1, ··· 280 278 .min_uV = 1800000, 281 279 .max_uV = 1800000, 282 280 .apply_uV = 1, 281 + .always_on = 1, 283 282 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 284 283 .state_mem = { 285 284 .disabled = 1, ··· 296 293 .min_uV = 3300000, 297 294 .max_uV = 3300000, 298 295 .apply_uV = 1, 296 + .always_on = 1, 299 297 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 300 298 .state_mem = { 301 299 .disabled = 1, ··· 606 602 .setup_gpio = exynos4_fimd0_gpio_setup_24bpp, 607 603 }; 608 604 605 + /* Bluetooth rfkill gpio platform data */ 606 + struct rfkill_gpio_platform_data origen_bt_pdata = { 607 + .reset_gpio = EXYNOS4_GPX2(2), 608 + .shutdown_gpio = -1, 609 + .type = RFKILL_TYPE_BLUETOOTH, 610 + .name = "origen-bt", 611 + }; 612 + 613 + /* Bluetooth Platform device */ 614 + static struct platform_device origen_device_bluetooth = { 615 + .name = "rfkill_gpio", 616 + .id = -1, 617 + .dev = { 618 + .platform_data = &origen_bt_pdata, 619 + }, 620 + }; 621 + 609 622 static struct platform_device *origen_devices[] __initdata = { 610 623 &s3c_device_hsmmc2, 611 624 &s3c_device_hsmmc0, ··· 634 613 &s5p_device_fimc1, 635 614 &s5p_device_fimc2, 636 615 &s5p_device_fimc3, 616 + &s5p_device_fimc_md, 637 617 &s5p_device_fimd0, 618 + &s5p_device_g2d, 638 619 &s5p_device_hdmi, 639 620 &s5p_device_i2c_hdmiphy, 621 + &s5p_device_jpeg, 640 622 &s5p_device_mfc, 641 623 &s5p_device_mfc_l, 642 624 &s5p_device_mfc_r, ··· 647 623 &exynos4_device_ohci, 648 624 &origen_device_gpiokeys, 649 625 &origen_lcd_hv070wsa, 626 + &origen_device_bluetooth, 650 627 }; 651 628 652 629 /* LCD Backlight data */ ··· 660 635 .pwm_id = 0, 661 636 .pwm_period_ns = 1000, 662 637 }; 638 + 639 + static void __init origen_bt_setup(void) 640 + { 641 + gpio_request(EXYNOS4_GPA0(0), "GPIO BT_UART"); 642 + /* 4 UART Pins configuration */ 643 + s3c_gpio_cfgrange_nopull(EXYNOS4_GPA0(0), 4, S3C_GPIO_SFN(2)); 644 + /* Setup BT Reset, this gpio will be requesed by rfkill-gpio */ 645 + s3c_gpio_cfgpin(EXYNOS4_GPX2(2), S3C_GPIO_OUTPUT); 646 + s3c_gpio_setpull(EXYNOS4_GPX2(2), S3C_GPIO_PULL_NONE); 647 + } 663 648 664 649 static void s5p_tv_setup(void) 665 650 { ··· 724 689 platform_add_devices(origen_devices, ARRAY_SIZE(origen_devices)); 725 690 726 691 samsung_bl_set(&origen_bl_gpio_info, &origen_bl_data); 692 + 693 + origen_bt_setup(); 727 694 } 728 695 729 696 MACHINE_START(ORIGEN, "ORIGEN")
+3
arch/arm/mach-exynos/mach-smdkv310.c
··· 270 270 &s5p_device_fimc1, 271 271 &s5p_device_fimc2, 272 272 &s5p_device_fimc3, 273 + &s5p_device_fimc_md, 274 + &s5p_device_g2d, 275 + &s5p_device_jpeg, 273 276 &exynos4_device_ac97, 274 277 &exynos4_device_i2s0, 275 278 &exynos4_device_ohci,
+75 -5
arch/arm/mach-exynos/mach-universal_c210.c
··· 47 47 #include <media/v4l2-mediabus.h> 48 48 #include <media/s5p_fimc.h> 49 49 #include <media/m5mols.h> 50 + #include <media/s5k6aa.h> 50 51 51 52 #include "common.h" 52 53 ··· 124 123 static struct regulator_consumer_supply lp3974_buck2_consumer = 125 124 REGULATOR_SUPPLY("vddg3d", NULL); 126 125 127 - static struct regulator_consumer_supply lp3974_buck3_consumer = 128 - REGULATOR_SUPPLY("vdet", "s5p-sdo"); 126 + static struct regulator_consumer_supply lp3974_buck3_consumer[] = { 127 + REGULATOR_SUPPLY("vdet", "s5p-sdo"), 128 + REGULATOR_SUPPLY("vdd_reg", "0-003c"), 129 + }; 129 130 130 131 static struct regulator_init_data lp3974_buck1_data = { 131 132 .constraints = { ··· 172 169 .enabled = 1, 173 170 }, 174 171 }, 175 - .num_consumer_supplies = 1, 176 - .consumer_supplies = &lp3974_buck3_consumer, 172 + .num_consumer_supplies = ARRAY_SIZE(lp3974_buck3_consumer), 173 + .consumer_supplies = lp3974_buck3_consumer, 177 174 }; 178 175 179 176 static struct regulator_init_data lp3974_buck4_data = { ··· 306 303 .consumer_supplies = lp3974_ldo8_consumer, 307 304 }; 308 305 306 + static struct regulator_consumer_supply lp3974_ldo9_consumer = 307 + REGULATOR_SUPPLY("vddio", "0-003c"); 308 + 309 309 static struct regulator_init_data lp3974_ldo9_data = { 310 310 .constraints = { 311 311 .name = "VCC_2.8V", ··· 320 314 .enabled = 1, 321 315 }, 322 316 }, 317 + .num_consumer_supplies = 1, 318 + .consumer_supplies = &lp3974_ldo9_consumer, 323 319 }; 324 320 325 321 static struct regulator_init_data lp3974_ldo10_data = { ··· 420 412 }; 421 413 422 414 static struct regulator_consumer_supply lp3974_ldo16_consumer[] = { 415 + REGULATOR_SUPPLY("vdda", "0-003c"), 423 416 REGULATOR_SUPPLY("a_sensor", "0-001f"), 424 417 }; 425 418 ··· 828 819 }, 829 820 .max_bpp = 32, 830 821 .default_bpp = 16, 822 + .virtual_x = 480, 823 + .virtual_y = 2 * 800, 831 824 }; 832 825 833 826 static struct s3c_fb_platdata universal_lcd_pdata __initdata = { ··· 839 828 .vidcon1 = VIDCON1_INV_VCLK | VIDCON1_INV_VDEN 840 829 | VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC, 841 830 .setup_gpio = exynos4_fimd0_gpio_setup_24bpp, 831 + }; 832 + 833 + static struct regulator_consumer_supply cam_vt_dio_supply = 834 + REGULATOR_SUPPLY("vdd_core", "0-003c"); 835 + 836 + static struct regulator_init_data cam_vt_dio_reg_init_data = { 837 + .constraints = { .valid_ops_mask = REGULATOR_CHANGE_STATUS }, 838 + .num_consumer_supplies = 1, 839 + .consumer_supplies = &cam_vt_dio_supply, 840 + }; 841 + 842 + static struct fixed_voltage_config cam_vt_dio_fixed_voltage_cfg = { 843 + .supply_name = "CAM_VT_D_IO", 844 + .microvolts = 2800000, 845 + .gpio = EXYNOS4_GPE2(1), /* CAM_PWR_EN2 */ 846 + .enable_high = 1, 847 + .init_data = &cam_vt_dio_reg_init_data, 848 + }; 849 + 850 + static struct platform_device cam_vt_dio_fixed_reg_dev = { 851 + .name = "reg-fixed-voltage", .id = FIXED_REG_ID_CAM_VT_DIO, 852 + .dev = { .platform_data = &cam_vt_dio_fixed_voltage_cfg }, 842 853 }; 843 854 844 855 static struct regulator_consumer_supply cam_i_core_supply = ··· 918 885 #define GPIO_CAM_LEVEL_EN(n) EXYNOS4_GPE4(n + 3) 919 886 #define GPIO_CAM_8M_ISP_INT EXYNOS4_GPX1(5) /* XEINT_13 */ 920 887 #define GPIO_CAM_MEGA_nRST EXYNOS4_GPE2(5) 888 + #define GPIO_CAM_VGA_NRST EXYNOS4_GPE4(7) 889 + #define GPIO_CAM_VGA_NSTBY EXYNOS4_GPE4(6) 890 + 891 + static int s5k6aa_set_power(int on) 892 + { 893 + gpio_set_value(GPIO_CAM_LEVEL_EN(2), !!on); 894 + return 0; 895 + } 896 + 897 + static struct s5k6aa_platform_data s5k6aa_platdata = { 898 + .mclk_frequency = 21600000UL, 899 + .gpio_reset = { GPIO_CAM_VGA_NRST, 0 }, 900 + .gpio_stby = { GPIO_CAM_VGA_NSTBY, 0 }, 901 + .bus_type = V4L2_MBUS_PARALLEL, 902 + .horiz_flip = 1, 903 + .set_power = s5k6aa_set_power, 904 + }; 905 + 906 + static struct i2c_board_info s5k6aa_board_info = { 907 + I2C_BOARD_INFO("S5K6AA", 0x3C), 908 + .platform_data = &s5k6aa_platdata, 909 + }; 921 910 922 911 static int m5mols_set_power(struct device *dev, int on) 923 912 { ··· 964 909 .mux_id = 0, 965 910 .flags = V4L2_MBUS_PCLK_SAMPLE_FALLING | 966 911 V4L2_MBUS_VSYNC_ACTIVE_LOW, 912 + .bus_type = FIMC_ITU_601, 913 + .board_info = &s5k6aa_board_info, 914 + .i2c_bus_num = 0, 915 + .clk_frequency = 24000000UL, 916 + }, { 917 + .mux_id = 0, 918 + .flags = V4L2_MBUS_PCLK_SAMPLE_FALLING | 919 + V4L2_MBUS_VSYNC_ACTIVE_LOW, 967 920 .bus_type = FIMC_MIPI_CSI2, 968 921 .board_info = &m5mols_board_info, 969 922 .i2c_bus_num = 0, ··· 990 927 { GPIO_CAM_LEVEL_EN(2), GPIOF_OUT_INIT_LOW, "CAM_LVL_EN2" }, 991 928 { GPIO_CAM_8M_ISP_INT, GPIOF_IN, "8M_ISP_INT" }, 992 929 { GPIO_CAM_MEGA_nRST, GPIOF_OUT_INIT_LOW, "CAM_8M_NRST" }, 930 + { GPIO_CAM_VGA_NRST, GPIOF_OUT_INIT_LOW, "CAM_VGA_NRST" }, 931 + { GPIO_CAM_VGA_NSTBY, GPIOF_OUT_INIT_LOW, "CAM_VGA_NSTBY" }, 993 932 }; 994 933 995 - static void universal_camera_init(void) 934 + static void __init universal_camera_init(void) 996 935 { 997 936 s3c_set_platdata(&mipi_csis_platdata, sizeof(mipi_csis_platdata), 998 937 &s5p_device_mipi_csis0); ··· 1015 950 /* Free GPIOs controlled directly by the sensor drivers. */ 1016 951 gpio_free(GPIO_CAM_MEGA_nRST); 1017 952 gpio_free(GPIO_CAM_8M_ISP_INT); 953 + gpio_free(GPIO_CAM_VGA_NRST); 954 + gpio_free(GPIO_CAM_VGA_NSTBY); 1018 955 1019 956 if (exynos4_fimc_setup_gpio(S5P_CAMPORT_A)) 1020 957 pr_err("Camera port A setup failed\n"); ··· 1029 962 &s5p_device_fimc1, 1030 963 &s5p_device_fimc2, 1031 964 &s5p_device_fimc3, 965 + &s5p_device_g2d, 1032 966 &mmc0_fixed_voltage, 1033 967 &s3c_device_hsmmc0, 1034 968 &s3c_device_hsmmc2, ··· 1048 980 &universal_gpio_keys, 1049 981 &s5p_device_onenand, 1050 982 &s5p_device_fimd0, 983 + &s5p_device_jpeg, 1051 984 &s5p_device_mfc, 1052 985 &s5p_device_mfc_l, 1053 986 &s5p_device_mfc_r, 987 + &cam_vt_dio_fixed_reg_dev, 1054 988 &cam_i_core_fixed_reg_dev, 1055 989 &cam_s_if_fixed_reg_dev, 1056 990 &s5p_device_fimc_md,
+4 -1
arch/arm/mach-imx/Kconfig
··· 314 314 select IMX_HAVE_PLATFORM_IMX_I2C 315 315 select IMX_HAVE_PLATFORM_IMX_SSI 316 316 select IMX_HAVE_PLATFORM_IMX_UART 317 - select IMX_HAVE_PLATFORM_MXC_MMC 317 + select IMX_HAVE_PLATFORM_MX2_CAMERA 318 318 select IMX_HAVE_PLATFORM_MXC_EHCI 319 + select IMX_HAVE_PLATFORM_MXC_MMC 320 + select LEDS_GPIO_REGISTER 319 321 help 320 322 Include support for Visstrim_m10 platform and its different variants. 321 323 This includes specific configurations for the board and its ··· 488 486 bool "Support mx31moboard platforms (EPFL Mobots group)" 489 487 select SOC_IMX31 490 488 select IMX_HAVE_PLATFORM_FSL_USB2_UDC 489 + select IMX_HAVE_PLATFORM_IMX2_WDT 491 490 select IMX_HAVE_PLATFORM_IMX_I2C 492 491 select IMX_HAVE_PLATFORM_IMX_UART 493 492 select IMX_HAVE_PLATFORM_IPU_CORE
+137 -2
arch/arm/mach-imx/mach-imx27_visstrim_m10.c
··· 30 30 #include <linux/input.h> 31 31 #include <linux/gpio.h> 32 32 #include <linux/delay.h> 33 + #include <linux/dma-mapping.h> 34 + #include <linux/leds.h> 35 + #include <linux/memblock.h> 36 + #include <media/soc_camera.h> 33 37 #include <sound/tlv320aic32x4.h> 34 38 #include <asm/mach-types.h> 35 39 #include <asm/mach/arch.h> ··· 43 39 44 40 #include "devices-imx27.h" 45 41 42 + #define TVP5150_RSTN (GPIO_PORTC + 18) 43 + #define TVP5150_PWDN (GPIO_PORTC + 19) 46 44 #define OTG_PHY_CS_GPIO (GPIO_PORTF + 17) 47 45 #define SDHC1_IRQ IRQ_GPIOB(25) 48 46 ··· 106 100 PE1_PF_USBOTG_STP, 107 101 PB23_PF_USB_PWR, 108 102 PB24_PF_USB_OC, 103 + /* CSI */ 104 + PB10_PF_CSI_D0, 105 + PB11_PF_CSI_D1, 106 + PB12_PF_CSI_D2, 107 + PB13_PF_CSI_D3, 108 + PB14_PF_CSI_D4, 109 + PB15_PF_CSI_MCLK, 110 + PB16_PF_CSI_PIXCLK, 111 + PB17_PF_CSI_D5, 112 + PB18_PF_CSI_D6, 113 + PB19_PF_CSI_D7, 114 + PB20_PF_CSI_VSYNC, 115 + PB21_PF_CSI_HSYNC, 109 116 }; 117 + 118 + /* Camera */ 119 + static int visstrim_camera_power(struct device *dev, int on) 120 + { 121 + gpio_set_value(TVP5150_PWDN, on); 122 + 123 + return 0; 124 + }; 125 + 126 + static int visstrim_camera_reset(struct device *dev) 127 + { 128 + gpio_set_value(TVP5150_RSTN, 0); 129 + ndelay(500); 130 + gpio_set_value(TVP5150_RSTN, 1); 131 + 132 + return 0; 133 + }; 134 + 135 + static struct i2c_board_info visstrim_i2c_camera = { 136 + I2C_BOARD_INFO("tvp5150", 0x5d), 137 + }; 138 + 139 + static struct soc_camera_link iclink_tvp5150 = { 140 + .bus_id = 0, 141 + .board_info = &visstrim_i2c_camera, 142 + .i2c_adapter_id = 0, 143 + .power = visstrim_camera_power, 144 + .reset = visstrim_camera_reset, 145 + }; 146 + 147 + static struct mx2_camera_platform_data visstrim_camera = { 148 + .flags = MX2_CAMERA_CCIR | MX2_CAMERA_CCIR_INTERLACE | 149 + MX2_CAMERA_SWAP16 | MX2_CAMERA_PCLK_SAMPLE_RISING, 150 + .clk = 100000, 151 + }; 152 + 153 + static phys_addr_t mx2_camera_base __initdata; 154 + #define MX2_CAMERA_BUF_SIZE SZ_8M 155 + 156 + static void __init visstrim_camera_init(void) 157 + { 158 + struct platform_device *pdev; 159 + int dma; 160 + 161 + /* Initialize tvp5150 gpios */ 162 + mxc_gpio_mode(TVP5150_RSTN | GPIO_GPIO | GPIO_OUT); 163 + mxc_gpio_mode(TVP5150_PWDN | GPIO_GPIO | GPIO_OUT); 164 + gpio_set_value(TVP5150_RSTN, 1); 165 + gpio_set_value(TVP5150_PWDN, 0); 166 + ndelay(1); 167 + 168 + gpio_set_value(TVP5150_PWDN, 1); 169 + ndelay(1); 170 + gpio_set_value(TVP5150_RSTN, 0); 171 + ndelay(500); 172 + gpio_set_value(TVP5150_RSTN, 1); 173 + ndelay(200000); 174 + 175 + pdev = imx27_add_mx2_camera(&visstrim_camera); 176 + if (IS_ERR(pdev)) 177 + return; 178 + 179 + dma = dma_declare_coherent_memory(&pdev->dev, 180 + mx2_camera_base, mx2_camera_base, 181 + MX2_CAMERA_BUF_SIZE, 182 + DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE); 183 + if (!(dma & DMA_MEMORY_MAP)) 184 + return; 185 + } 186 + 187 + static void __init visstrim_reserve(void) 188 + { 189 + /* reserve 4 MiB for mx2-camera */ 190 + mx2_camera_base = memblock_alloc(MX2_CAMERA_BUF_SIZE, 191 + MX2_CAMERA_BUF_SIZE); 192 + memblock_free(mx2_camera_base, MX2_CAMERA_BUF_SIZE); 193 + memblock_remove(mx2_camera_base, MX2_CAMERA_BUF_SIZE); 194 + } 110 195 111 196 /* GPIOs used as events for applications */ 112 197 static struct gpio_keys_button visstrim_gpio_keys[] = { ··· 231 134 visstrim_gpio_keys_platform_data __initconst = { 232 135 .buttons = visstrim_gpio_keys, 233 136 .nbuttons = ARRAY_SIZE(visstrim_gpio_keys), 137 + }; 138 + 139 + /* led */ 140 + static const struct gpio_led visstrim_m10_leds[] __initconst = { 141 + { 142 + .name = "visstrim:ld0", 143 + .default_trigger = "nand-disk", 144 + .gpio = (GPIO_PORTC + 29), 145 + }, 146 + { 147 + .name = "visstrim:ld1", 148 + .default_trigger = "nand-disk", 149 + .gpio = (GPIO_PORTC + 24), 150 + }, 151 + { 152 + .name = "visstrim:ld2", 153 + .default_trigger = "nand-disk", 154 + .gpio = (GPIO_PORTC + 28), 155 + }, 156 + { 157 + .name = "visstrim:ld3", 158 + .default_trigger = "nand-disk", 159 + .gpio = (GPIO_PORTC + 25), 160 + }, 161 + }; 162 + 163 + static const struct gpio_led_platform_data visstrim_m10_led_data __initconst = { 164 + .leds = visstrim_m10_leds, 165 + .num_leds = ARRAY_SIZE(visstrim_m10_leds), 234 166 }; 235 167 236 168 /* Visstrim_SM10 has a microSD slot connected to sdhc1 */ ··· 342 216 { 343 217 I2C_BOARD_INFO("tlv320aic32x4", 0x18), 344 218 .platform_data = &visstrim_m10_aic32x4_pdata, 219 + }, 220 + { 221 + I2C_BOARD_INFO("m41t00", 0x68), 345 222 } 346 223 }; 347 224 ··· 383 254 imx27_add_imx_ssi(0, &visstrim_m10_ssi_pdata); 384 255 imx27_add_imx_uart0(&uart_pdata); 385 256 386 - i2c_register_board_info(0, visstrim_m10_i2c_devices, 387 - ARRAY_SIZE(visstrim_m10_i2c_devices)); 388 257 imx27_add_imx_i2c(0, &visstrim_m10_i2c_data); 389 258 imx27_add_imx_i2c(1, &visstrim_m10_i2c_data); 259 + i2c_register_board_info(0, visstrim_m10_i2c_devices, 260 + ARRAY_SIZE(visstrim_m10_i2c_devices)); 261 + 390 262 imx27_add_mxc_mmc(0, &visstrim_m10_sdhc_pdata); 391 263 imx27_add_mxc_ehci_otg(&visstrim_m10_usbotg_pdata); 392 264 imx27_add_fec(NULL); 393 265 imx_add_gpio_keys(&visstrim_gpio_keys_platform_data); 394 266 platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); 395 267 imx_add_platform_device("mx27vis", 0, NULL, 0, NULL, 0); 268 + platform_device_register_resndata(NULL, "soc-camera-pdrv", 0, NULL, 0, 269 + &iclink_tvp5150, sizeof(iclink_tvp5150)); 270 + gpio_led_register_device(0, &visstrim_m10_led_data); 271 + visstrim_camera_init(); 396 272 } 397 273 398 274 static void __init visstrim_m10_timer_init(void) ··· 411 277 412 278 MACHINE_START(IMX27_VISSTRIM_M10, "Vista Silicon Visstrim_M10") 413 279 .atag_offset = 0x100, 280 + .reserve = visstrim_reserve, 414 281 .map_io = mx27_map_io, 415 282 .init_early = imx27_init_early, 416 283 .init_irq = mx27_init_irq,
+3 -1
arch/arm/mach-imx/mach-mx31moboard.c
··· 530 530 platform_add_devices(devices, ARRAY_SIZE(devices)); 531 531 gpio_led_register_device(-1, &mx31moboard_led_pdata); 532 532 533 + imx31_add_imx2_wdt(NULL); 534 + 533 535 imx31_add_imx_uart0(&uart0_pdata); 534 536 imx31_add_imx_uart4(&uart4_pdata); 535 537 ··· 592 590 } 593 591 594 592 MACHINE_START(MX31MOBOARD, "EPFL Mobots mx31moboard") 595 - /* Maintainer: Valentin Longchamp, EPFL Mobots group */ 593 + /* Maintainer: Philippe Retornaz, EPFL Mobots group */ 596 594 .atag_offset = 0x100, 597 595 .reserve = mx31moboard_reserve, 598 596 .map_io = mx31_map_io,
+216
arch/arm/mach-imx/mach-mx35_3ds.c
··· 4 4 * 5 5 * Author: Fabio Estevam <fabio.estevam@freescale.com> 6 6 * 7 + * Copyright (C) 2011 Meprolight, Ltd. 8 + * Alex Gershgorin <alexg@meprolight.com> 9 + * 10 + * Modified from i.MX31 3-Stack Development System 11 + * 7 12 * This program is free software; you can redistribute it and/or modify 8 13 * it under the terms of the GNU General Public License as published by 9 14 * the Free Software Foundation; either version 2 of the License, or ··· 39 34 #include <asm/mach/arch.h> 40 35 #include <asm/mach/time.h> 41 36 #include <asm/mach/map.h> 37 + #include <asm/memblock.h> 42 38 43 39 #include <mach/hardware.h> 44 40 #include <mach/common.h> 45 41 #include <mach/iomux-mx35.h> 46 42 #include <mach/irqs.h> 47 43 #include <mach/3ds_debugboard.h> 44 + #include <video/platform_lcd.h> 45 + 46 + #include <media/soc_camera.h> 48 47 49 48 #include "devices-imx35.h" 49 + 50 + #define GPIO_MC9S08DZ60_GPS_ENABLE 0 51 + #define GPIO_MC9S08DZ60_HDD_ENABLE 4 52 + #define GPIO_MC9S08DZ60_WIFI_ENABLE 5 53 + #define GPIO_MC9S08DZ60_LCD_ENABLE 6 54 + #define GPIO_MC9S08DZ60_SPEAKER_ENABLE 8 55 + 56 + static const struct fb_videomode fb_modedb[] = { 57 + { 58 + /* 800x480 @ 55 Hz */ 59 + .name = "Ceramate-CLAA070VC01", 60 + .refresh = 55, 61 + .xres = 800, 62 + .yres = 480, 63 + .pixclock = 40000, 64 + .left_margin = 40, 65 + .right_margin = 40, 66 + .upper_margin = 5, 67 + .lower_margin = 5, 68 + .hsync_len = 20, 69 + .vsync_len = 10, 70 + .sync = FB_SYNC_OE_ACT_HIGH, 71 + .vmode = FB_VMODE_NONINTERLACED, 72 + .flag = 0, 73 + }, 74 + }; 75 + 76 + static const struct ipu_platform_data mx3_ipu_data __initconst = { 77 + .irq_base = MXC_IPU_IRQ_START, 78 + }; 79 + 80 + static struct mx3fb_platform_data mx3fb_pdata __initdata = { 81 + .name = "Ceramate-CLAA070VC01", 82 + .mode = fb_modedb, 83 + .num_modes = ARRAY_SIZE(fb_modedb), 84 + }; 85 + 86 + static struct i2c_board_info __initdata i2c_devices_3ds[] = { 87 + { 88 + I2C_BOARD_INFO("mc9s08dz60", 0x69), 89 + }, 90 + }; 91 + 92 + static int lcd_power_gpio = -ENXIO; 93 + 94 + static int mc9s08dz60_gpiochip_match(struct gpio_chip *chip, 95 + void *data) 96 + { 97 + return !strcmp(chip->label, data); 98 + } 99 + 100 + static void mx35_3ds_lcd_set_power( 101 + struct plat_lcd_data *pd, unsigned int power) 102 + { 103 + struct gpio_chip *chip; 104 + 105 + if (!gpio_is_valid(lcd_power_gpio)) { 106 + chip = gpiochip_find( 107 + "mc9s08dz60", mc9s08dz60_gpiochip_match); 108 + if (chip) { 109 + lcd_power_gpio = 110 + chip->base + GPIO_MC9S08DZ60_LCD_ENABLE; 111 + if (gpio_request(lcd_power_gpio, "lcd_power") < 0) { 112 + pr_err("error: gpio already requested!\n"); 113 + lcd_power_gpio = -ENXIO; 114 + } 115 + } else { 116 + pr_err("error: didn't find mc9s08dz60 gpio chip\n"); 117 + } 118 + } 119 + 120 + if (gpio_is_valid(lcd_power_gpio)) 121 + gpio_set_value_cansleep(lcd_power_gpio, power); 122 + } 123 + 124 + static struct plat_lcd_data mx35_3ds_lcd_data = { 125 + .set_power = mx35_3ds_lcd_set_power, 126 + }; 127 + 128 + static struct platform_device mx35_3ds_lcd = { 129 + .name = "platform-lcd", 130 + .dev.platform_data = &mx35_3ds_lcd_data, 131 + }; 50 132 51 133 #define EXPIO_PARENT_INT gpio_to_irq(IMX_GPIO_NR(1, 1)) 52 134 ··· 212 120 /* I2C1 */ 213 121 MX35_PAD_I2C1_CLK__I2C1_SCL, 214 122 MX35_PAD_I2C1_DAT__I2C1_SDA, 123 + /* Display */ 124 + MX35_PAD_LD0__IPU_DISPB_DAT_0, 125 + MX35_PAD_LD1__IPU_DISPB_DAT_1, 126 + MX35_PAD_LD2__IPU_DISPB_DAT_2, 127 + MX35_PAD_LD3__IPU_DISPB_DAT_3, 128 + MX35_PAD_LD4__IPU_DISPB_DAT_4, 129 + MX35_PAD_LD5__IPU_DISPB_DAT_5, 130 + MX35_PAD_LD6__IPU_DISPB_DAT_6, 131 + MX35_PAD_LD7__IPU_DISPB_DAT_7, 132 + MX35_PAD_LD8__IPU_DISPB_DAT_8, 133 + MX35_PAD_LD9__IPU_DISPB_DAT_9, 134 + MX35_PAD_LD10__IPU_DISPB_DAT_10, 135 + MX35_PAD_LD11__IPU_DISPB_DAT_11, 136 + MX35_PAD_LD12__IPU_DISPB_DAT_12, 137 + MX35_PAD_LD13__IPU_DISPB_DAT_13, 138 + MX35_PAD_LD14__IPU_DISPB_DAT_14, 139 + MX35_PAD_LD15__IPU_DISPB_DAT_15, 140 + MX35_PAD_LD16__IPU_DISPB_DAT_16, 141 + MX35_PAD_LD17__IPU_DISPB_DAT_17, 142 + MX35_PAD_D3_HSYNC__IPU_DISPB_D3_HSYNC, 143 + MX35_PAD_D3_FPSHIFT__IPU_DISPB_D3_CLK, 144 + MX35_PAD_D3_DRDY__IPU_DISPB_D3_DRDY, 145 + MX35_PAD_CONTRAST__IPU_DISPB_CONTR, 146 + MX35_PAD_D3_VSYNC__IPU_DISPB_D3_VSYNC, 147 + MX35_PAD_D3_REV__IPU_DISPB_D3_REV, 148 + MX35_PAD_D3_CLS__IPU_DISPB_D3_CLS, 149 + /* CSI */ 150 + MX35_PAD_TX1__IPU_CSI_D_6, 151 + MX35_PAD_TX0__IPU_CSI_D_7, 152 + MX35_PAD_CSI_D8__IPU_CSI_D_8, 153 + MX35_PAD_CSI_D9__IPU_CSI_D_9, 154 + MX35_PAD_CSI_D10__IPU_CSI_D_10, 155 + MX35_PAD_CSI_D11__IPU_CSI_D_11, 156 + MX35_PAD_CSI_D12__IPU_CSI_D_12, 157 + MX35_PAD_CSI_D13__IPU_CSI_D_13, 158 + MX35_PAD_CSI_D14__IPU_CSI_D_14, 159 + MX35_PAD_CSI_D15__IPU_CSI_D_15, 160 + MX35_PAD_CSI_HSYNC__IPU_CSI_HSYNC, 161 + MX35_PAD_CSI_MCLK__IPU_CSI_MCLK, 162 + MX35_PAD_CSI_PIXCLK__IPU_CSI_PIXCLK, 163 + MX35_PAD_CSI_VSYNC__IPU_CSI_VSYNC, 164 + }; 165 + 166 + /* 167 + * Camera support 168 + */ 169 + static phys_addr_t mx3_camera_base __initdata; 170 + #define MX35_3DS_CAMERA_BUF_SIZE SZ_8M 171 + 172 + static const struct mx3_camera_pdata mx35_3ds_camera_pdata __initconst = { 173 + .flags = MX3_CAMERA_DATAWIDTH_8, 174 + .mclk_10khz = 2000, 175 + }; 176 + 177 + static int __init imx35_3ds_init_camera(void) 178 + { 179 + int dma, ret = -ENOMEM; 180 + struct platform_device *pdev = 181 + imx35_alloc_mx3_camera(&mx35_3ds_camera_pdata); 182 + 183 + if (IS_ERR(pdev)) 184 + return PTR_ERR(pdev); 185 + 186 + if (!mx3_camera_base) 187 + goto err; 188 + 189 + dma = dma_declare_coherent_memory(&pdev->dev, 190 + mx3_camera_base, mx3_camera_base, 191 + MX35_3DS_CAMERA_BUF_SIZE, 192 + DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE); 193 + 194 + if (!(dma & DMA_MEMORY_MAP)) 195 + goto err; 196 + 197 + ret = platform_device_add(pdev); 198 + if (ret) 199 + err: 200 + platform_device_put(pdev); 201 + 202 + return ret; 203 + } 204 + 205 + static const struct ipu_platform_data mx35_3ds_ipu_data __initconst = { 206 + .irq_base = MXC_IPU_IRQ_START, 207 + }; 208 + 209 + static struct i2c_board_info mx35_3ds_i2c_camera = { 210 + I2C_BOARD_INFO("ov2640", 0x30), 211 + }; 212 + 213 + static struct soc_camera_link iclink_ov2640 = { 214 + .bus_id = 0, 215 + .board_info = &mx35_3ds_i2c_camera, 216 + .i2c_adapter_id = 0, 217 + .power = NULL, 218 + }; 219 + 220 + static struct platform_device mx35_3ds_ov2640 = { 221 + .name = "soc-camera-pdrv", 222 + .id = 0, 223 + .dev = { 224 + .platform_data = &iclink_ov2640, 225 + }, 215 226 }; 216 227 217 228 static int mx35_3ds_otg_init(struct platform_device *pdev) ··· 374 179 */ 375 180 static void __init mx35_3ds_init(void) 376 181 { 182 + struct platform_device *imx35_fb_pdev; 183 + 377 184 imx35_soc_init(); 378 185 379 186 mxc_iomux_v3_setup_multiple_pads(mx35pdk_pads, ARRAY_SIZE(mx35pdk_pads)); ··· 401 204 pr_warn("Init of the debugboard failed, all " 402 205 "devices on the debugboard are unusable.\n"); 403 206 imx35_add_imx_i2c0(&mx35_3ds_i2c0_data); 207 + 208 + i2c_register_board_info( 209 + 0, i2c_devices_3ds, ARRAY_SIZE(i2c_devices_3ds)); 210 + 211 + imx35_add_ipu_core(&mx35_3ds_ipu_data); 212 + platform_device_register(&mx35_3ds_ov2640); 213 + imx35_3ds_init_camera(); 214 + 215 + imx35_fb_pdev = imx35_add_mx3_sdc_fb(&mx3fb_pdata); 216 + mx35_3ds_lcd.dev.parent = &imx35_fb_pdev->dev; 217 + platform_device_register(&mx35_3ds_lcd); 404 218 } 405 219 406 220 static void __init mx35pdk_timer_init(void) ··· 423 215 .init = mx35pdk_timer_init, 424 216 }; 425 217 218 + static void __init mx35_3ds_reserve(void) 219 + { 220 + /* reserve MX35_3DS_CAMERA_BUF_SIZE bytes for mx3-camera */ 221 + mx3_camera_base = arm_memblock_steal(MX35_3DS_CAMERA_BUF_SIZE, 222 + MX35_3DS_CAMERA_BUF_SIZE); 223 + } 224 + 426 225 MACHINE_START(MX35_3DS, "Freescale MX35PDK") 427 226 /* Maintainer: Freescale Semiconductor, Inc */ 428 227 .atag_offset = 0x100, ··· 439 224 .handle_irq = imx35_handle_irq, 440 225 .timer = &mx35pdk_timer, 441 226 .init_machine = mx35_3ds_init, 227 + .reserve = mx35_3ds_reserve, 442 228 .restart = mxc_restart, 443 229 MACHINE_END
+14
arch/arm/mach-kirkwood/Kconfig
··· 44 44 Say 'Y' here if you want your kernel to support the 45 45 Marvell GuruPlug Reference Board. 46 46 47 + config ARCH_KIRKWOOD_DT 48 + bool "Marvell Kirkwood Flattened Device Tree" 49 + select USE_OF 50 + help 51 + Say 'Y' here if you want your kernel to support the 52 + Marvell Kirkwood using flattened device tree. 53 + 54 + config MACH_DREAMPLUG_DT 55 + bool "Marvell DreamPlug (Flattened Device Tree)" 56 + select ARCH_KIRKWOOD_DT 57 + help 58 + Say 'Y' here if you want your kernel to support the 59 + Marvell DreamPlug (Flattened Device Tree). 60 + 47 61 config MACH_TS219 48 62 bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS" 49 63 help
+1
arch/arm/mach-kirkwood/Makefile
··· 20 20 obj-$(CONFIG_MACH_T5325) += t5325-setup.o 21 21 22 22 obj-$(CONFIG_CPU_IDLE) += cpuidle.o 23 + obj-$(CONFIG_ARCH_KIRKWOOD_DT) += board-dt.o
+2
arch/arm/mach-kirkwood/Makefile.boot
··· 1 1 zreladdr-y += 0x00008000 2 2 params_phys-y := 0x00000100 3 3 initrd_phys-y := 0x00800000 4 + 5 + dtb-$(CONFIG_MACH_DREAMPLUG_DT) += kirkwood-dreamplug.dtb
+180
arch/arm/mach-kirkwood/board-dt.c
··· 1 + /* 2 + * Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net> 3 + * 4 + * arch/arm/mach-kirkwood/board-dt.c 5 + * 6 + * Marvell DreamPlug Reference Board Setup 7 + * 8 + * This file is licensed under the terms of the GNU General Public 9 + * License version 2. This program is licensed "as is" without any 10 + * warranty of any kind, whether express or implied. 11 + */ 12 + 13 + #include <linux/kernel.h> 14 + #include <linux/init.h> 15 + #include <linux/platform_device.h> 16 + #include <linux/mtd/partitions.h> 17 + #include <linux/ata_platform.h> 18 + #include <linux/mv643xx_eth.h> 19 + #include <linux/of.h> 20 + #include <linux/of_address.h> 21 + #include <linux/of_fdt.h> 22 + #include <linux/of_irq.h> 23 + #include <linux/of_platform.h> 24 + #include <linux/gpio.h> 25 + #include <linux/leds.h> 26 + #include <linux/mtd/physmap.h> 27 + #include <linux/spi/flash.h> 28 + #include <linux/spi/spi.h> 29 + #include <linux/spi/orion_spi.h> 30 + #include <asm/mach-types.h> 31 + #include <asm/mach/arch.h> 32 + #include <mach/kirkwood.h> 33 + #include <plat/mvsdio.h> 34 + #include "common.h" 35 + #include "mpp.h" 36 + 37 + static struct of_device_id kirkwood_dt_match_table[] __initdata = { 38 + { .compatible = "simple-bus", }, 39 + { } 40 + }; 41 + 42 + struct mtd_partition dreamplug_partitions[] = { 43 + { 44 + .name = "u-boot", 45 + .size = SZ_512K, 46 + .offset = 0, 47 + }, 48 + { 49 + .name = "u-boot env", 50 + .size = SZ_64K, 51 + .offset = SZ_512K + SZ_512K, 52 + }, 53 + { 54 + .name = "dtb", 55 + .size = SZ_64K, 56 + .offset = SZ_512K + SZ_512K + SZ_512K, 57 + }, 58 + }; 59 + 60 + static const struct flash_platform_data dreamplug_spi_slave_data = { 61 + .type = "mx25l1606e", 62 + .name = "spi_flash", 63 + .parts = dreamplug_partitions, 64 + .nr_parts = ARRAY_SIZE(dreamplug_partitions), 65 + }; 66 + 67 + static struct spi_board_info __initdata dreamplug_spi_slave_info[] = { 68 + { 69 + .modalias = "m25p80", 70 + .platform_data = &dreamplug_spi_slave_data, 71 + .irq = -1, 72 + .max_speed_hz = 50000000, 73 + .bus_num = 0, 74 + .chip_select = 0, 75 + }, 76 + }; 77 + 78 + static struct mv643xx_eth_platform_data dreamplug_ge00_data = { 79 + .phy_addr = MV643XX_ETH_PHY_ADDR(0), 80 + }; 81 + 82 + static struct mv643xx_eth_platform_data dreamplug_ge01_data = { 83 + .phy_addr = MV643XX_ETH_PHY_ADDR(1), 84 + }; 85 + 86 + static struct mv_sata_platform_data dreamplug_sata_data = { 87 + .n_ports = 1, 88 + }; 89 + 90 + static struct mvsdio_platform_data dreamplug_mvsdio_data = { 91 + /* unfortunately the CD signal has not been connected */ 92 + }; 93 + 94 + static struct gpio_led dreamplug_led_pins[] = { 95 + { 96 + .name = "dreamplug:blue:bluetooth", 97 + .gpio = 47, 98 + .active_low = 1, 99 + }, 100 + { 101 + .name = "dreamplug:green:wifi", 102 + .gpio = 48, 103 + .active_low = 1, 104 + }, 105 + { 106 + .name = "dreamplug:green:wifi_ap", 107 + .gpio = 49, 108 + .active_low = 1, 109 + }, 110 + }; 111 + 112 + static struct gpio_led_platform_data dreamplug_led_data = { 113 + .leds = dreamplug_led_pins, 114 + .num_leds = ARRAY_SIZE(dreamplug_led_pins), 115 + }; 116 + 117 + static struct platform_device dreamplug_leds = { 118 + .name = "leds-gpio", 119 + .id = -1, 120 + .dev = { 121 + .platform_data = &dreamplug_led_data, 122 + } 123 + }; 124 + 125 + static unsigned int dreamplug_mpp_config[] __initdata = { 126 + MPP0_SPI_SCn, 127 + MPP1_SPI_MOSI, 128 + MPP2_SPI_SCK, 129 + MPP3_SPI_MISO, 130 + MPP47_GPIO, /* Bluetooth LED */ 131 + MPP48_GPIO, /* Wifi LED */ 132 + MPP49_GPIO, /* Wifi AP LED */ 133 + 0 134 + }; 135 + 136 + static void __init dreamplug_init(void) 137 + { 138 + /* 139 + * Basic setup. Needs to be called early. 140 + */ 141 + kirkwood_mpp_conf(dreamplug_mpp_config); 142 + 143 + spi_register_board_info(dreamplug_spi_slave_info, 144 + ARRAY_SIZE(dreamplug_spi_slave_info)); 145 + kirkwood_spi_init(); 146 + 147 + kirkwood_ehci_init(); 148 + kirkwood_ge00_init(&dreamplug_ge00_data); 149 + kirkwood_ge01_init(&dreamplug_ge01_data); 150 + kirkwood_sata_init(&dreamplug_sata_data); 151 + kirkwood_sdio_init(&dreamplug_mvsdio_data); 152 + 153 + platform_device_register(&dreamplug_leds); 154 + } 155 + 156 + static void __init kirkwood_dt_init(void) 157 + { 158 + kirkwood_init(); 159 + 160 + if (of_machine_is_compatible("globalscale,dreamplug")) 161 + dreamplug_init(); 162 + 163 + of_platform_populate(NULL, kirkwood_dt_match_table, NULL, NULL); 164 + } 165 + 166 + static const char *kirkwood_dt_board_compat[] = { 167 + "globalscale,dreamplug", 168 + NULL 169 + }; 170 + 171 + DT_MACHINE_START(KIRKWOOD_DT, "Marvell Kirkwood (Flattened Device Tree)") 172 + /* Maintainer: Jason Cooper <jason@lakedaemon.net> */ 173 + .map_io = kirkwood_map_io, 174 + .init_early = kirkwood_init_early, 175 + .init_irq = kirkwood_init_irq, 176 + .timer = &kirkwood_timer, 177 + .init_machine = kirkwood_dt_init, 178 + .restart = kirkwood_restart, 179 + .dt_compat = kirkwood_dt_board_compat, 180 + MACHINE_END
+1
arch/arm/mach-mmp/mmp2.c
··· 223 223 }, { 224 224 .start = IRQ_MMP2_GPIO, 225 225 .end = IRQ_MMP2_GPIO, 226 + .name = "gpio_mux", 226 227 .flags = IORESOURCE_IRQ, 227 228 }, 228 229 };
+1
arch/arm/mach-mmp/pxa168.c
··· 166 166 }, { 167 167 .start = IRQ_PXA168_GPIOX, 168 168 .end = IRQ_PXA168_GPIOX, 169 + .name = "gpio_mux", 169 170 .flags = IORESOURCE_IRQ, 170 171 }, 171 172 };
+1
arch/arm/mach-mmp/pxa910.c
··· 173 173 }, { 174 174 .start = IRQ_PXA910_AP_GPIO, 175 175 .end = IRQ_PXA910_AP_GPIO, 176 + .name = "gpio_mux", 176 177 .flags = IORESOURCE_IRQ, 177 178 }, 178 179 };
+16
arch/arm/mach-mxs/Kconfig
··· 83 83 select MXS_HAVE_PLATFORM_MXSFB 84 84 select MXS_OCOTP 85 85 86 + config MODULE_APX4 87 + bool 88 + select SOC_IMX28 89 + select LEDS_GPIO_REGISTER 90 + select MXS_HAVE_AMBA_DUART 91 + select MXS_HAVE_PLATFORM_AUART 92 + select MXS_HAVE_PLATFORM_FEC 93 + select MXS_HAVE_PLATFORM_MXS_I2C 94 + select MXS_HAVE_PLATFORM_MXS_MMC 95 + select MXS_HAVE_PLATFORM_MXS_SAIF 96 + select MXS_OCOTP 97 + 86 98 config MACH_TX28 87 99 bool "Ka-Ro TX28 module" 88 100 select MODULE_TX28 ··· 102 90 config MACH_M28EVK 103 91 bool "Support DENX M28EVK Platform" 104 92 select MODULE_M28 93 + 94 + config MACH_APX4DEVKIT 95 + bool "Support Bluegiga APX4 Development Kit" 96 + select MODULE_APX4 105 97 106 98 endif
+1
arch/arm/mach-mxs/Makefile
··· 11 11 obj-$(CONFIG_MACH_MX23EVK) += mach-mx23evk.o 12 12 obj-$(CONFIG_MACH_MX28EVK) += mach-mx28evk.o 13 13 obj-$(CONFIG_MACH_M28EVK) += mach-m28evk.o 14 + obj-$(CONFIG_MACH_APX4DEVKIT) += mach-apx4devkit.o 14 15 obj-$(CONFIG_MODULE_TX28) += module-tx28.o 15 16 obj-$(CONFIG_MACH_TX28) += mach-tx28.o 16 17
+1
arch/arm/mach-mxs/include/mach/digctl.h
··· 18 18 #define HW_DIGCTL_CTRL 0x0 19 19 #define BP_DIGCTL_CTRL_SAIF_CLKMUX 10 20 20 #define BM_DIGCTL_CTRL_SAIF_CLKMUX (0x3 << 10) 21 + #define HW_DIGCTL_CHIPID 0x310 21 22 #endif
+16 -13
arch/arm/mach-mxs/include/mach/mxs.h
··· 23 23 #include <linux/io.h> 24 24 #endif 25 25 #include <asm/mach-types.h> 26 + #include <mach/digctl.h> 26 27 #include <mach/hardware.h> 27 - 28 - /* 29 - * MXS CPU types 30 - */ 31 - #define cpu_is_mx23() ( \ 32 - machine_is_mx23evk() || \ 33 - machine_is_stmp378x() || \ 34 - 0) 35 - #define cpu_is_mx28() ( \ 36 - machine_is_mx28evk() || \ 37 - machine_is_m28evk() || \ 38 - machine_is_tx28() || \ 39 - 0) 40 28 41 29 /* 42 30 * IO addresses common to MXS-based ··· 96 108 static inline void __mxs_togl(u32 mask, void __iomem *reg) 97 109 { 98 110 __raw_writel(mask, reg + MXS_TOG_ADDR); 111 + } 112 + 113 + /* 114 + * MXS CPU types 115 + */ 116 + #define MXS_CHIPID (MXS_IO_ADDRESS(MXS_DIGCTL_BASE_ADDR) + HW_DIGCTL_CHIPID) 117 + 118 + static inline int cpu_is_mx23(void) 119 + { 120 + return ((__raw_readl(MXS_CHIPID) >> 16) == 0x3780); 121 + } 122 + 123 + static inline int cpu_is_mx28(void) 124 + { 125 + return ((__raw_readl(MXS_CHIPID) >> 16) == 0x2800); 99 126 } 100 127 #endif 101 128
+6 -7
arch/arm/mach-mxs/include/mach/uncompress.h
··· 18 18 #ifndef __MACH_MXS_UNCOMPRESS_H__ 19 19 #define __MACH_MXS_UNCOMPRESS_H__ 20 20 21 - #include <asm/mach-types.h> 22 - 23 21 unsigned long mxs_duart_base; 24 22 25 23 #define MXS_DUART(x) (*(volatile unsigned long *)(mxs_duart_base + (x))) ··· 53 55 54 56 #define MX23_DUART_BASE_ADDR 0x80070000 55 57 #define MX28_DUART_BASE_ADDR 0x80074000 58 + #define MXS_DIGCTL_CHIPID 0x8001c310 56 59 57 60 static inline void __arch_decomp_setup(unsigned long arch_id) 58 61 { 59 - switch (arch_id) { 60 - case MACH_TYPE_MX23EVK: 62 + u16 chipid = (*(volatile unsigned long *) MXS_DIGCTL_CHIPID) >> 16; 63 + 64 + switch (chipid) { 65 + case 0x3780: 61 66 mxs_duart_base = MX23_DUART_BASE_ADDR; 62 67 break; 63 - case MACH_TYPE_MX28EVK: 64 - case MACH_TYPE_M28EVK: 65 - case MACH_TYPE_TX28: 68 + case 0x2800: 66 69 mxs_duart_base = MX28_DUART_BASE_ADDR; 67 70 break; 68 71 default:
+260
arch/arm/mach-mxs/mach-apx4devkit.c
··· 1 + /* 2 + * Copyright (C) 2011-2012 3 + * Lauri Hintsala, Bluegiga, <lauri.hintsala@bluegiga.com> 4 + * Veli-Pekka Peltola, Bluegiga, <veli-pekka.peltola@bluegiga.com> 5 + * 6 + * based on: mach-mx28evk.c 7 + * Copyright 2010 Freescale Semiconductor, Inc. All Rights Reserved. 8 + * 9 + * This program is free software; you can redistribute it and/or modify 10 + * it under the terms of the GNU General Public License as published by 11 + * the Free Software Foundation; either version 2 of the License, or 12 + * (at your option) any later version. 13 + * 14 + * This program is distributed in the hope that it will be useful, 15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 + * GNU General Public License for more details. 18 + */ 19 + 20 + #include <linux/delay.h> 21 + #include <linux/platform_device.h> 22 + #include <linux/gpio.h> 23 + #include <linux/leds.h> 24 + #include <linux/clk.h> 25 + #include <linux/i2c.h> 26 + #include <linux/regulator/machine.h> 27 + #include <linux/regulator/fixed.h> 28 + #include <linux/micrel_phy.h> 29 + 30 + #include <asm/mach-types.h> 31 + #include <asm/mach/arch.h> 32 + #include <asm/mach/time.h> 33 + 34 + #include <mach/common.h> 35 + #include <mach/digctl.h> 36 + #include <mach/iomux-mx28.h> 37 + 38 + #include "devices-mx28.h" 39 + 40 + #define APX4DEVKIT_GPIO_USERLED MXS_GPIO_NR(3, 28) 41 + 42 + static const iomux_cfg_t apx4devkit_pads[] __initconst = { 43 + /* duart */ 44 + MX28_PAD_PWM0__DUART_RX | MXS_PAD_CTRL, 45 + MX28_PAD_PWM1__DUART_TX | MXS_PAD_CTRL, 46 + 47 + /* auart0 */ 48 + MX28_PAD_AUART0_RX__AUART0_RX | MXS_PAD_CTRL, 49 + MX28_PAD_AUART0_TX__AUART0_TX | MXS_PAD_CTRL, 50 + MX28_PAD_AUART0_CTS__AUART0_CTS | MXS_PAD_CTRL, 51 + MX28_PAD_AUART0_RTS__AUART0_RTS | MXS_PAD_CTRL, 52 + 53 + /* auart1 */ 54 + MX28_PAD_AUART1_RX__AUART1_RX | MXS_PAD_CTRL, 55 + MX28_PAD_AUART1_TX__AUART1_TX | MXS_PAD_CTRL, 56 + 57 + /* auart2 */ 58 + MX28_PAD_SSP2_SCK__AUART2_RX | MXS_PAD_CTRL, 59 + MX28_PAD_SSP2_MOSI__AUART2_TX | MXS_PAD_CTRL, 60 + 61 + /* auart3 */ 62 + MX28_PAD_SSP2_MISO__AUART3_RX | MXS_PAD_CTRL, 63 + MX28_PAD_SSP2_SS0__AUART3_TX | MXS_PAD_CTRL, 64 + 65 + #define MXS_PAD_FEC (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP) 66 + /* fec0 */ 67 + MX28_PAD_ENET0_MDC__ENET0_MDC | MXS_PAD_FEC, 68 + MX28_PAD_ENET0_MDIO__ENET0_MDIO | MXS_PAD_FEC, 69 + MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | MXS_PAD_FEC, 70 + MX28_PAD_ENET0_RXD0__ENET0_RXD0 | MXS_PAD_FEC, 71 + MX28_PAD_ENET0_RXD1__ENET0_RXD1 | MXS_PAD_FEC, 72 + MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | MXS_PAD_FEC, 73 + MX28_PAD_ENET0_TXD0__ENET0_TXD0 | MXS_PAD_FEC, 74 + MX28_PAD_ENET0_TXD1__ENET0_TXD1 | MXS_PAD_FEC, 75 + MX28_PAD_ENET_CLK__CLKCTRL_ENET | MXS_PAD_FEC, 76 + 77 + /* i2c */ 78 + MX28_PAD_I2C0_SCL__I2C0_SCL, 79 + MX28_PAD_I2C0_SDA__I2C0_SDA, 80 + 81 + /* mmc0 */ 82 + MX28_PAD_SSP0_DATA0__SSP0_D0 | 83 + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 84 + MX28_PAD_SSP0_DATA1__SSP0_D1 | 85 + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 86 + MX28_PAD_SSP0_DATA2__SSP0_D2 | 87 + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 88 + MX28_PAD_SSP0_DATA3__SSP0_D3 | 89 + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 90 + MX28_PAD_SSP0_DATA4__SSP0_D4 | 91 + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 92 + MX28_PAD_SSP0_DATA5__SSP0_D5 | 93 + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 94 + MX28_PAD_SSP0_DATA6__SSP0_D6 | 95 + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 96 + MX28_PAD_SSP0_DATA7__SSP0_D7 | 97 + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 98 + MX28_PAD_SSP0_CMD__SSP0_CMD | 99 + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 100 + MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT | 101 + (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), 102 + MX28_PAD_SSP0_SCK__SSP0_SCK | 103 + (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL), 104 + 105 + /* led */ 106 + MX28_PAD_PWM3__GPIO_3_28 | MXS_PAD_CTRL, 107 + 108 + /* saif0 & saif1 */ 109 + MX28_PAD_SAIF0_MCLK__SAIF0_MCLK | 110 + (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 111 + MX28_PAD_SAIF0_LRCLK__SAIF0_LRCLK | 112 + (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 113 + MX28_PAD_SAIF0_BITCLK__SAIF0_BITCLK | 114 + (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 115 + MX28_PAD_SAIF0_SDATA0__SAIF0_SDATA0 | 116 + (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 117 + MX28_PAD_SAIF1_SDATA0__SAIF1_SDATA0 | 118 + (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP), 119 + }; 120 + 121 + /* led */ 122 + static const struct gpio_led apx4devkit_leds[] __initconst = { 123 + { 124 + .name = "user-led", 125 + .default_trigger = "heartbeat", 126 + .gpio = APX4DEVKIT_GPIO_USERLED, 127 + }, 128 + }; 129 + 130 + static const struct gpio_led_platform_data apx4devkit_led_data __initconst = { 131 + .leds = apx4devkit_leds, 132 + .num_leds = ARRAY_SIZE(apx4devkit_leds), 133 + }; 134 + 135 + static const struct fec_platform_data mx28_fec_pdata __initconst = { 136 + .phy = PHY_INTERFACE_MODE_RMII, 137 + }; 138 + 139 + static const struct mxs_mmc_platform_data apx4devkit_mmc_pdata __initconst = { 140 + .wp_gpio = -EINVAL, 141 + .flags = SLOTF_4_BIT_CAPABLE, 142 + }; 143 + 144 + static const struct i2c_board_info apx4devkit_i2c_boardinfo[] __initconst = { 145 + { I2C_BOARD_INFO("sgtl5000", 0x0a) }, /* ASoC */ 146 + { I2C_BOARD_INFO("pcf8563", 0x51) }, /* RTC */ 147 + }; 148 + 149 + #if defined(CONFIG_REGULATOR_FIXED_VOLTAGE) || \ 150 + defined(CONFIG_REGULATOR_FIXED_VOLTAGE_MODULE) 151 + static struct regulator_consumer_supply apx4devkit_audio_consumer_supplies[] = { 152 + REGULATOR_SUPPLY("VDDA", "0-000a"), 153 + REGULATOR_SUPPLY("VDDIO", "0-000a"), 154 + }; 155 + 156 + static struct regulator_init_data apx4devkit_vdd_reg_init_data = { 157 + .constraints = { 158 + .name = "3V3", 159 + .always_on = 1, 160 + }, 161 + .consumer_supplies = apx4devkit_audio_consumer_supplies, 162 + .num_consumer_supplies = ARRAY_SIZE(apx4devkit_audio_consumer_supplies), 163 + }; 164 + 165 + static struct fixed_voltage_config apx4devkit_vdd_pdata = { 166 + .supply_name = "board-3V3", 167 + .microvolts = 3300000, 168 + .gpio = -EINVAL, 169 + .enabled_at_boot = 1, 170 + .init_data = &apx4devkit_vdd_reg_init_data, 171 + }; 172 + 173 + static struct platform_device apx4devkit_voltage_regulator = { 174 + .name = "reg-fixed-voltage", 175 + .id = -1, 176 + .num_resources = 0, 177 + .dev = { 178 + .platform_data = &apx4devkit_vdd_pdata, 179 + }, 180 + }; 181 + 182 + static void __init apx4devkit_add_regulators(void) 183 + { 184 + platform_device_register(&apx4devkit_voltage_regulator); 185 + } 186 + #else 187 + static void __init apx4devkit_add_regulators(void) {} 188 + #endif 189 + 190 + static const struct mxs_saif_platform_data 191 + apx4devkit_mxs_saif_pdata[] __initconst = { 192 + /* working on EXTMSTR0 mode (saif0 master, saif1 slave) */ 193 + { 194 + .master_mode = 1, 195 + .master_id = 0, 196 + }, { 197 + .master_mode = 0, 198 + .master_id = 0, 199 + }, 200 + }; 201 + 202 + static int apx4devkit_phy_fixup(struct phy_device *phy) 203 + { 204 + phy->dev_flags |= MICREL_PHY_50MHZ_CLK; 205 + return 0; 206 + } 207 + 208 + static void __init apx4devkit_init(void) 209 + { 210 + mxs_iomux_setup_multiple_pads(apx4devkit_pads, 211 + ARRAY_SIZE(apx4devkit_pads)); 212 + 213 + mx28_add_duart(); 214 + mx28_add_auart0(); 215 + mx28_add_auart1(); 216 + mx28_add_auart2(); 217 + mx28_add_auart3(); 218 + 219 + /* 220 + * Register fixup for the Micrel KS8031 PHY clock 221 + * (shares same ID with KS8051) 222 + */ 223 + phy_register_fixup_for_uid(PHY_ID_KS8051, MICREL_PHY_ID_MASK, 224 + apx4devkit_phy_fixup); 225 + 226 + mx28_add_fec(0, &mx28_fec_pdata); 227 + 228 + mx28_add_mxs_mmc(0, &apx4devkit_mmc_pdata); 229 + 230 + gpio_led_register_device(0, &apx4devkit_led_data); 231 + 232 + mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0); 233 + mx28_add_saif(0, &apx4devkit_mxs_saif_pdata[0]); 234 + mx28_add_saif(1, &apx4devkit_mxs_saif_pdata[1]); 235 + 236 + apx4devkit_add_regulators(); 237 + 238 + mx28_add_mxs_i2c(0); 239 + i2c_register_board_info(0, apx4devkit_i2c_boardinfo, 240 + ARRAY_SIZE(apx4devkit_i2c_boardinfo)); 241 + 242 + mxs_add_platform_device("mxs-sgtl5000", 0, NULL, 0, NULL, 0); 243 + } 244 + 245 + static void __init apx4devkit_timer_init(void) 246 + { 247 + mx28_clocks_init(); 248 + } 249 + 250 + static struct sys_timer apx4devkit_timer = { 251 + .init = apx4devkit_timer_init, 252 + }; 253 + 254 + MACHINE_START(APX4DEVKIT, "Bluegiga APX4 Development Kit") 255 + .map_io = mx28_map_io, 256 + .init_irq = mx28_init_irq, 257 + .timer = &apx4devkit_timer, 258 + .init_machine = apx4devkit_init, 259 + .restart = mxs_restart, 260 + MACHINE_END
+2 -5
arch/arm/mach-mxs/mach-m28evk.c
··· 247 247 u32 val; 248 248 const u32 *ocotp = mxs_get_ocotp(); 249 249 250 - if (!ocotp) { 251 - pr_err("%s: timeout when reading fec mac from OCOTP\n", 252 - __func__); 250 + if (!ocotp) 253 251 return -ETIMEDOUT; 254 - } 255 252 256 253 /* 257 254 * OCOTP only stores the last 4 octets for each mac address, 258 255 * so hard-code DENX OUI (C0:E5:4E) here. 259 256 */ 260 257 for (i = 0; i < 2; i++) { 261 - val = ocotp[i * 4]; 258 + val = ocotp[i]; 262 259 mx28_fec_pdata[i].mac[0] = 0xC0; 263 260 mx28_fec_pdata[i].mac[1] = 0xE5; 264 261 mx28_fec_pdata[i].mac[2] = 0x4E;
+18 -62
arch/arm/mach-mxs/mach-mx28evk.c
··· 223 223 /* fec */ 224 224 static void __init mx28evk_fec_reset(void) 225 225 { 226 - int ret; 227 226 struct clk *clk; 228 227 229 228 /* Enable fec phy clock */ ··· 230 231 if (!IS_ERR(clk)) 231 232 clk_prepare_enable(clk); 232 233 233 - /* Power up fec phy */ 234 - ret = gpio_request(MX28EVK_FEC_PHY_POWER, "fec-phy-power"); 235 - if (ret) { 236 - pr_err("Failed to request gpio fec-phy-%s: %d\n", "power", ret); 237 - return; 238 - } 239 - 240 - ret = gpio_direction_output(MX28EVK_FEC_PHY_POWER, 0); 241 - if (ret) { 242 - pr_err("Failed to drive gpio fec-phy-%s: %d\n", "power", ret); 243 - return; 244 - } 245 - 246 - /* Reset fec phy */ 247 - ret = gpio_request(MX28EVK_FEC_PHY_RESET, "fec-phy-reset"); 248 - if (ret) { 249 - pr_err("Failed to request gpio fec-phy-%s: %d\n", "reset", ret); 250 - return; 251 - } 252 - 253 - gpio_direction_output(MX28EVK_FEC_PHY_RESET, 0); 254 - if (ret) { 255 - pr_err("Failed to drive gpio fec-phy-%s: %d\n", "reset", ret); 256 - return; 257 - } 258 - 234 + gpio_set_value(MX28EVK_FEC_PHY_RESET, 0); 259 235 mdelay(1); 260 236 gpio_set_value(MX28EVK_FEC_PHY_RESET, 1); 261 237 } ··· 252 278 const u32 *ocotp = mxs_get_ocotp(); 253 279 254 280 if (!ocotp) 255 - goto error; 281 + return -ETIMEDOUT; 256 282 257 283 /* 258 284 * OCOTP only stores the last 4 octets for each mac address, 259 285 * so hard-code Freescale OUI (00:04:9f) here. 260 286 */ 261 287 for (i = 0; i < 2; i++) { 262 - val = ocotp[i * 4]; 288 + val = ocotp[i]; 263 289 mx28_fec_pdata[i].mac[0] = 0x00; 264 290 mx28_fec_pdata[i].mac[1] = 0x04; 265 291 mx28_fec_pdata[i].mac[2] = 0x9f; ··· 269 295 } 270 296 271 297 return 0; 272 - 273 - error: 274 - pr_err("%s: timeout when reading fec mac from OCOTP\n", __func__); 275 - return -ETIMEDOUT; 276 298 } 277 299 278 300 /* ··· 387 417 static void __init mx28evk_add_regulators(void) {} 388 418 #endif 389 419 390 - static struct gpio mx28evk_lcd_gpios[] = { 420 + static const struct gpio mx28evk_gpios[] __initconst = { 391 421 { MX28EVK_LCD_ENABLE, GPIOF_OUT_INIT_HIGH, "lcd-enable" }, 392 422 { MX28EVK_BL_ENABLE, GPIOF_OUT_INIT_HIGH, "bl-enable" }, 423 + { MX28EVK_FLEXCAN_SWITCH, GPIOF_DIR_OUT, "flexcan-switch" }, 424 + { MX28EVK_MMC0_SLOT_POWER, GPIOF_OUT_INIT_LOW, "mmc0-slot-power" }, 425 + { MX28EVK_MMC1_SLOT_POWER, GPIOF_OUT_INIT_LOW, "mmc1-slot-power" }, 426 + { MX28EVK_FEC_PHY_POWER, GPIOF_OUT_INIT_LOW, "fec-phy-power" }, 427 + { MX28EVK_FEC_PHY_RESET, GPIOF_DIR_OUT, "fec-phy-reset" }, 393 428 }; 394 429 395 430 static const struct mxs_saif_platform_data ··· 422 447 if (mx28evk_fec_get_mac()) 423 448 pr_warn("%s: failed on fec mac setup\n", __func__); 424 449 450 + ret = gpio_request_array(mx28evk_gpios, ARRAY_SIZE(mx28evk_gpios)); 451 + if (ret) 452 + pr_err("One or more GPIOs failed to be requested: %d\n", ret); 453 + 425 454 mx28evk_fec_reset(); 426 455 mx28_add_fec(0, &mx28_fec_pdata[0]); 427 456 mx28_add_fec(1, &mx28_fec_pdata[1]); 428 457 429 - ret = gpio_request_one(MX28EVK_FLEXCAN_SWITCH, GPIOF_DIR_OUT, 430 - "flexcan-switch"); 431 - if (ret) { 432 - pr_err("failed to request gpio flexcan-switch: %d\n", ret); 433 - } else { 434 - mx28_add_flexcan(0, &mx28evk_flexcan_pdata[0]); 435 - mx28_add_flexcan(1, &mx28evk_flexcan_pdata[1]); 436 - } 458 + mx28_add_flexcan(0, &mx28evk_flexcan_pdata[0]); 459 + mx28_add_flexcan(1, &mx28evk_flexcan_pdata[1]); 437 460 438 - ret = gpio_request_array(mx28evk_lcd_gpios, 439 - ARRAY_SIZE(mx28evk_lcd_gpios)); 440 - if (ret) 441 - pr_warn("failed to request gpio pins for lcd: %d\n", ret); 442 - else 443 - mx28_add_mxsfb(&mx28evk_mxsfb_pdata); 461 + mx28_add_mxsfb(&mx28evk_mxsfb_pdata); 444 462 445 463 mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0); 446 464 mx28_add_saif(0, &mx28evk_mxs_saif_pdata[0]); ··· 448 480 mxs_add_platform_device("mxs-sgtl5000", 0, NULL, 0, 449 481 NULL, 0); 450 482 451 - /* power on mmc slot by writing 0 to the gpio */ 452 - ret = gpio_request_one(MX28EVK_MMC0_SLOT_POWER, GPIOF_OUT_INIT_LOW, 453 - "mmc0-slot-power"); 454 - if (ret) 455 - pr_warn("failed to request gpio mmc0-slot-power: %d\n", ret); 456 - else 457 - mx28_add_mxs_mmc(0, &mx28evk_mmc_pdata[0]); 458 - 459 - ret = gpio_request_one(MX28EVK_MMC1_SLOT_POWER, GPIOF_OUT_INIT_LOW, 460 - "mmc1-slot-power"); 461 - if (ret) 462 - pr_warn("failed to request gpio mmc1-slot-power: %d\n", ret); 463 - else 464 - mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]); 483 + mx28_add_mxs_mmc(0, &mx28evk_mmc_pdata[0]); 484 + mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]); 465 485 466 486 mx28_add_rtc_stmp3xxx(); 467 487
+4
arch/arm/mach-omap1/Kconfig
··· 152 152 bool "Amstrad E3 (Delta)" 153 153 depends on ARCH_OMAP1 && ARCH_OMAP15XX 154 154 select FIQ 155 + select GPIO_GENERIC_PLATFORM 156 + select LEDS_GPIO_REGISTER 157 + select REGULATOR 158 + select REGULATOR_FIXED_VOLTAGE 155 159 help 156 160 Support for the Amstrad E3 (codename Delta) videophone. Say Y here 157 161 if you have such a device.
+269 -45
arch/arm/mach-omap1/board-ams-delta.c
··· 11 11 * it under the terms of the GNU General Public License version 2 as 12 12 * published by the Free Software Foundation. 13 13 */ 14 + #include <linux/basic_mmio_gpio.h> 14 15 #include <linux/gpio.h> 15 16 #include <linux/kernel.h> 16 17 #include <linux/init.h> ··· 19 18 #include <linux/interrupt.h> 20 19 #include <linux/leds.h> 21 20 #include <linux/platform_device.h> 21 + #include <linux/regulator/consumer.h> 22 + #include <linux/regulator/fixed.h> 23 + #include <linux/regulator/machine.h> 22 24 #include <linux/serial_8250.h> 23 25 #include <linux/export.h> 24 26 #include <linux/omapfb.h> ··· 46 42 47 43 #include "iomap.h" 48 44 #include "common.h" 49 - 50 - static u8 ams_delta_latch1_reg; 51 - static u16 ams_delta_latch2_reg; 52 45 53 46 static const unsigned int ams_delta_keymap[] = { 54 47 KEY(0, 0, KEY_F1), /* Advert */ ··· 125 124 KEY(7, 3, KEY_LEFTCTRL), /* Vol down */ 126 125 }; 127 126 128 - void ams_delta_latch1_write(u8 mask, u8 value) 129 - { 130 - ams_delta_latch1_reg &= ~mask; 131 - ams_delta_latch1_reg |= value; 132 - *(volatile __u8 *) AMS_DELTA_LATCH1_VIRT = ams_delta_latch1_reg; 133 - } 134 - 135 - void ams_delta_latch2_write(u16 mask, u16 value) 136 - { 137 - ams_delta_latch2_reg &= ~mask; 138 - ams_delta_latch2_reg |= value; 139 - *(volatile __u16 *) AMS_DELTA_LATCH2_VIRT = ams_delta_latch2_reg; 140 - } 127 + #define LATCH1_PHYS 0x01000000 128 + #define LATCH1_VIRT 0xEA000000 129 + #define MODEM_PHYS 0x04000000 130 + #define MODEM_VIRT 0xEB000000 131 + #define LATCH2_PHYS 0x08000000 132 + #define LATCH2_VIRT 0xEC000000 141 133 142 134 static struct map_desc ams_delta_io_desc[] __initdata = { 143 135 /* AMS_DELTA_LATCH1 */ 144 136 { 145 - .virtual = AMS_DELTA_LATCH1_VIRT, 146 - .pfn = __phys_to_pfn(AMS_DELTA_LATCH1_PHYS), 137 + .virtual = LATCH1_VIRT, 138 + .pfn = __phys_to_pfn(LATCH1_PHYS), 147 139 .length = 0x01000000, 148 140 .type = MT_DEVICE 149 141 }, 150 142 /* AMS_DELTA_LATCH2 */ 151 143 { 152 - .virtual = AMS_DELTA_LATCH2_VIRT, 153 - .pfn = __phys_to_pfn(AMS_DELTA_LATCH2_PHYS), 144 + .virtual = LATCH2_VIRT, 145 + .pfn = __phys_to_pfn(LATCH2_PHYS), 154 146 .length = 0x01000000, 155 147 .type = MT_DEVICE 156 148 }, 157 149 /* AMS_DELTA_MODEM */ 158 150 { 159 - .virtual = AMS_DELTA_MODEM_VIRT, 160 - .pfn = __phys_to_pfn(AMS_DELTA_MODEM_PHYS), 151 + .virtual = MODEM_VIRT, 152 + .pfn = __phys_to_pfn(MODEM_PHYS), 161 153 .length = 0x01000000, 162 154 .type = MT_DEVICE 163 155 } 164 156 }; 165 157 166 - static struct omap_lcd_config ams_delta_lcd_config = { 158 + static struct omap_lcd_config ams_delta_lcd_config __initdata = { 167 159 .ctrl_name = "internal", 168 160 }; 169 161 170 - static struct omap_usb_config ams_delta_usb_config __initdata = { 162 + static struct omap_usb_config ams_delta_usb_config = { 171 163 .register_host = 1, 172 164 .hmc_mode = 16, 173 165 .pins[0] = 2, 174 166 }; 167 + 168 + #define LATCH1_GPIO_BASE 232 169 + #define LATCH1_NGPIO 8 170 + 171 + static struct resource latch1_resources[] = { 172 + [0] = { 173 + .name = "dat", 174 + .start = LATCH1_PHYS, 175 + .end = LATCH1_PHYS + (LATCH1_NGPIO - 1) / 8, 176 + .flags = IORESOURCE_MEM, 177 + }, 178 + }; 179 + 180 + static struct bgpio_pdata latch1_pdata = { 181 + .base = LATCH1_GPIO_BASE, 182 + .ngpio = LATCH1_NGPIO, 183 + }; 184 + 185 + static struct platform_device latch1_gpio_device = { 186 + .name = "basic-mmio-gpio", 187 + .id = 0, 188 + .resource = latch1_resources, 189 + .num_resources = ARRAY_SIZE(latch1_resources), 190 + .dev = { 191 + .platform_data = &latch1_pdata, 192 + }, 193 + }; 194 + 195 + static struct resource latch2_resources[] = { 196 + [0] = { 197 + .name = "dat", 198 + .start = LATCH2_PHYS, 199 + .end = LATCH2_PHYS + (AMS_DELTA_LATCH2_NGPIO - 1) / 8, 200 + .flags = IORESOURCE_MEM, 201 + }, 202 + }; 203 + 204 + static struct bgpio_pdata latch2_pdata = { 205 + .base = AMS_DELTA_LATCH2_GPIO_BASE, 206 + .ngpio = AMS_DELTA_LATCH2_NGPIO, 207 + }; 208 + 209 + static struct platform_device latch2_gpio_device = { 210 + .name = "basic-mmio-gpio", 211 + .id = 1, 212 + .resource = latch2_resources, 213 + .num_resources = ARRAY_SIZE(latch2_resources), 214 + .dev = { 215 + .platform_data = &latch2_pdata, 216 + }, 217 + }; 218 + 219 + static const struct gpio latch_gpios[] __initconst = { 220 + { 221 + .gpio = LATCH1_GPIO_BASE + 6, 222 + .flags = GPIOF_OUT_INIT_LOW, 223 + .label = "dockit1", 224 + }, 225 + { 226 + .gpio = LATCH1_GPIO_BASE + 7, 227 + .flags = GPIOF_OUT_INIT_LOW, 228 + .label = "dockit2", 229 + }, 230 + { 231 + .gpio = AMS_DELTA_GPIO_PIN_SCARD_RSTIN, 232 + .flags = GPIOF_OUT_INIT_LOW, 233 + .label = "scard_rstin", 234 + }, 235 + { 236 + .gpio = AMS_DELTA_GPIO_PIN_SCARD_CMDVCC, 237 + .flags = GPIOF_OUT_INIT_LOW, 238 + .label = "scard_cmdvcc", 239 + }, 240 + { 241 + .gpio = AMS_DELTA_GPIO_PIN_MODEM_CODEC, 242 + .flags = GPIOF_OUT_INIT_LOW, 243 + .label = "modem_codec", 244 + }, 245 + { 246 + .gpio = AMS_DELTA_LATCH2_GPIO_BASE + 14, 247 + .flags = GPIOF_OUT_INIT_LOW, 248 + .label = "hookflash1", 249 + }, 250 + { 251 + .gpio = AMS_DELTA_LATCH2_GPIO_BASE + 15, 252 + .flags = GPIOF_OUT_INIT_LOW, 253 + .label = "hookflash2", 254 + }, 255 + }; 256 + 257 + static struct regulator_consumer_supply modem_nreset_consumers[] = { 258 + REGULATOR_SUPPLY("RESET#", "serial8250.1"), 259 + REGULATOR_SUPPLY("POR", "cx20442-codec"), 260 + }; 261 + 262 + static struct regulator_init_data modem_nreset_data = { 263 + .constraints = { 264 + .valid_ops_mask = REGULATOR_CHANGE_STATUS, 265 + .boot_on = 1, 266 + }, 267 + .num_consumer_supplies = ARRAY_SIZE(modem_nreset_consumers), 268 + .consumer_supplies = modem_nreset_consumers, 269 + }; 270 + 271 + static struct fixed_voltage_config modem_nreset_config = { 272 + .supply_name = "modem_nreset", 273 + .microvolts = 3300000, 274 + .gpio = AMS_DELTA_GPIO_PIN_MODEM_NRESET, 275 + .startup_delay = 25000, 276 + .enable_high = 1, 277 + .enabled_at_boot = 1, 278 + .init_data = &modem_nreset_data, 279 + }; 280 + 281 + static struct platform_device modem_nreset_device = { 282 + .name = "reg-fixed-voltage", 283 + .id = -1, 284 + .dev = { 285 + .platform_data = &modem_nreset_config, 286 + }, 287 + }; 288 + 289 + struct modem_private_data { 290 + struct regulator *regulator; 291 + }; 292 + 293 + static struct modem_private_data modem_priv; 294 + 295 + void ams_delta_latch_write(int base, int ngpio, u16 mask, u16 value) 296 + { 297 + int bit = 0; 298 + u16 bitpos = 1 << bit; 299 + 300 + for (; bit < ngpio; bit++, bitpos = bitpos << 1) { 301 + if (!(mask & bitpos)) 302 + continue; 303 + else 304 + gpio_set_value(base + bit, (value & bitpos) != 0); 305 + } 306 + } 307 + EXPORT_SYMBOL(ams_delta_latch_write); 175 308 176 309 static struct resource ams_delta_nand_resources[] = { 177 310 [0] = { ··· 336 201 .keymap_size = ARRAY_SIZE(ams_delta_keymap), 337 202 }; 338 203 339 - static struct omap_kp_platform_data ams_delta_kp_data __initdata = { 204 + static struct omap_kp_platform_data ams_delta_kp_data = { 340 205 .rows = 8, 341 206 .cols = 8, 342 207 .keymap_data = &ams_delta_keymap_data, ··· 358 223 .id = -1, 359 224 }; 360 225 361 - static struct platform_device ams_delta_led_device = { 362 - .name = "ams-delta-led", 363 - .id = -1 226 + static const struct gpio_led gpio_leds[] __initconst = { 227 + { 228 + .name = "camera", 229 + .gpio = LATCH1_GPIO_BASE + 0, 230 + .default_state = LEDS_GPIO_DEFSTATE_OFF, 231 + #ifdef CONFIG_LEDS_TRIGGERS 232 + .default_trigger = "ams_delta_camera", 233 + #endif 234 + }, 235 + { 236 + .name = "advert", 237 + .gpio = LATCH1_GPIO_BASE + 1, 238 + .default_state = LEDS_GPIO_DEFSTATE_OFF, 239 + }, 240 + { 241 + .name = "email", 242 + .gpio = LATCH1_GPIO_BASE + 2, 243 + .default_state = LEDS_GPIO_DEFSTATE_OFF, 244 + }, 245 + { 246 + .name = "handsfree", 247 + .gpio = LATCH1_GPIO_BASE + 3, 248 + .default_state = LEDS_GPIO_DEFSTATE_OFF, 249 + }, 250 + { 251 + .name = "voicemail", 252 + .gpio = LATCH1_GPIO_BASE + 4, 253 + .default_state = LEDS_GPIO_DEFSTATE_OFF, 254 + }, 255 + { 256 + .name = "voice", 257 + .gpio = LATCH1_GPIO_BASE + 5, 258 + .default_state = LEDS_GPIO_DEFSTATE_OFF, 259 + }, 260 + }; 261 + 262 + static const struct gpio_led_platform_data leds_pdata __initconst = { 263 + .leds = gpio_leds, 264 + .num_leds = ARRAY_SIZE(gpio_leds), 364 265 }; 365 266 366 267 static struct i2c_board_info ams_delta_camera_board_info[] = { ··· 445 274 }; 446 275 447 276 static struct platform_device *ams_delta_devices[] __initdata = { 448 - &ams_delta_nand_device, 277 + &latch1_gpio_device, 278 + &latch2_gpio_device, 449 279 &ams_delta_kp_device, 450 - &ams_delta_lcd_device, 451 - &ams_delta_led_device, 452 280 &ams_delta_camera_device, 281 + }; 282 + 283 + static struct platform_device *late_devices[] __initdata = { 284 + &ams_delta_nand_device, 285 + &ams_delta_lcd_device, 453 286 }; 454 287 455 288 static void __init ams_delta_init(void) ··· 479 304 omap_serial_init(); 480 305 omap_register_i2c_bus(1, 100, NULL, 0); 481 306 482 - /* Clear latch2 (NAND, LCD, modem enable) */ 483 - ams_delta_latch2_write(~0, 0); 484 - 485 307 omap1_usb_init(&ams_delta_usb_config); 486 308 omap1_set_camera_info(&ams_delta_camera_platform_data); 487 309 #ifdef CONFIG_LEDS_TRIGGERS 488 310 led_trigger_register_simple("ams_delta_camera", 489 311 &ams_delta_camera_led_trigger); 490 312 #endif 313 + gpio_led_register_device(-1, &leds_pdata); 491 314 platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices)); 492 315 493 316 ams_delta_init_fiq(); ··· 495 322 omapfb_set_lcd_config(&ams_delta_lcd_config); 496 323 } 497 324 325 + static void modem_pm(struct uart_port *port, unsigned int state, unsigned old) 326 + { 327 + struct modem_private_data *priv = port->private_data; 328 + 329 + if (IS_ERR(priv->regulator)) 330 + return; 331 + 332 + if (state == old) 333 + return; 334 + 335 + if (state == 0) 336 + regulator_enable(priv->regulator); 337 + else if (old == 0) 338 + regulator_disable(priv->regulator); 339 + } 340 + 498 341 static struct plat_serial8250_port ams_delta_modem_ports[] = { 499 342 { 500 - .membase = IOMEM(AMS_DELTA_MODEM_VIRT), 501 - .mapbase = AMS_DELTA_MODEM_PHYS, 343 + .membase = IOMEM(MODEM_VIRT), 344 + .mapbase = MODEM_PHYS, 502 345 .irq = -EINVAL, /* changed later */ 503 346 .flags = UPF_BOOT_AUTOCONF, 504 347 .irqflags = IRQF_TRIGGER_RISING, 505 348 .iotype = UPIO_MEM, 506 349 .regshift = 1, 507 350 .uartclk = BASE_BAUD * 16, 351 + .pm = modem_pm, 352 + .private_data = &modem_priv, 508 353 }, 509 354 { }, 510 355 }; ··· 535 344 }, 536 345 }; 537 346 538 - static int __init ams_delta_modem_init(void) 347 + static int __init late_init(void) 539 348 { 540 349 int err; 541 350 542 351 if (!machine_is_ams_delta()) 543 352 return -ENODEV; 353 + 354 + err = gpio_request_array(latch_gpios, ARRAY_SIZE(latch_gpios)); 355 + if (err) { 356 + pr_err("Couldn't take over latch1/latch2 GPIO pins\n"); 357 + return err; 358 + } 359 + 360 + platform_add_devices(late_devices, ARRAY_SIZE(late_devices)); 361 + 362 + err = platform_device_register(&modem_nreset_device); 363 + if (err) { 364 + pr_err("Couldn't register the modem regulator device\n"); 365 + return err; 366 + } 544 367 545 368 omap_cfg_reg(M14_1510_GPIO2); 546 369 ams_delta_modem_ports[0].irq = ··· 567 362 } 568 363 gpio_direction_input(AMS_DELTA_GPIO_PIN_MODEM_IRQ); 569 364 570 - ams_delta_latch2_write( 571 - AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC, 572 - AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC); 365 + /* Initialize the modem_nreset regulator consumer before use */ 366 + modem_priv.regulator = ERR_PTR(-ENODEV); 573 367 574 - return platform_device_register(&ams_delta_modem_device); 368 + ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC, 369 + AMS_DELTA_LATCH2_MODEM_CODEC); 370 + 371 + err = platform_device_register(&ams_delta_modem_device); 372 + if (err) 373 + goto gpio_free; 374 + 375 + /* 376 + * Once the modem device is registered, the modem_nreset 377 + * regulator can be requested on behalf of that device. 378 + */ 379 + modem_priv.regulator = regulator_get(&ams_delta_modem_device.dev, 380 + "RESET#"); 381 + if (IS_ERR(modem_priv.regulator)) { 382 + err = PTR_ERR(modem_priv.regulator); 383 + goto unregister; 384 + } 385 + return 0; 386 + 387 + unregister: 388 + platform_device_unregister(&ams_delta_modem_device); 389 + gpio_free: 390 + gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ); 391 + return err; 575 392 } 576 - arch_initcall(ams_delta_modem_init); 393 + late_initcall(late_init); 577 394 578 395 static void __init ams_delta_map_io(void) 579 396 { ··· 614 387 .timer = &omap1_timer, 615 388 .restart = omap1_restart, 616 389 MACHINE_END 617 - 618 - EXPORT_SYMBOL(ams_delta_latch1_write); 619 - EXPORT_SYMBOL(ams_delta_latch2_write);
+2 -1
arch/arm/mach-omap2/Kconfig
··· 245 245 select MACH_NOKIA_N810_WIMAX 246 246 247 247 config MACH_NOKIA_RM680 248 - bool "Nokia RM-680 board" 248 + bool "Nokia RM-680/696 board" 249 249 depends on ARCH_OMAP3 250 250 default y 251 251 select OMAP_PACKAGE_CBB 252 + select MACH_NOKIA_RM696 252 253 253 254 config MACH_NOKIA_RX51 254 255 bool "Nokia RX-51 board"
+3
arch/arm/mach-omap2/Makefile
··· 270 270 obj-y += hwspinlock.o 271 271 endif 272 272 273 + emac-$(CONFIG_TI_DAVINCI_EMAC) := am35xx-emac.o 274 + obj-y += $(emac-m) $(emac-y) 275 + 273 276 obj-y += common-board-devices.o twl-common.o
+117
arch/arm/mach-omap2/am35xx-emac.c
··· 1 + /* 2 + * Copyright (C) 2011 Ilya Yanok, Emcraft Systems 3 + * 4 + * Based on mach-omap2/board-am3517evm.c 5 + * Copyright (C) 2009 Texas Instruments Incorporated 6 + * Author: Ranjith Lohithakshan <ranjithl@ti.com> 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License version 2 10 + * published by the Free Software Foundation. 11 + * 12 + * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind, 13 + * whether express or implied; without even the implied warranty of 14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 + * General Public License for more details. 16 + */ 17 + 18 + #include <linux/clk.h> 19 + #include <linux/davinci_emac.h> 20 + #include <linux/platform_device.h> 21 + #include <plat/irqs.h> 22 + #include <mach/am35xx.h> 23 + 24 + #include "control.h" 25 + 26 + static struct mdio_platform_data am35xx_emac_mdio_pdata; 27 + 28 + static struct resource am35xx_emac_mdio_resources[] = { 29 + DEFINE_RES_MEM(AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET, SZ_4K), 30 + }; 31 + 32 + static struct platform_device am35xx_emac_mdio_device = { 33 + .name = "davinci_mdio", 34 + .id = 0, 35 + .num_resources = ARRAY_SIZE(am35xx_emac_mdio_resources), 36 + .resource = am35xx_emac_mdio_resources, 37 + .dev.platform_data = &am35xx_emac_mdio_pdata, 38 + }; 39 + 40 + static void am35xx_enable_emac_int(void) 41 + { 42 + u32 regval; 43 + 44 + regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 45 + regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR | 46 + AM35XX_CPGMAC_C0_TX_PULSE_CLR | 47 + AM35XX_CPGMAC_C0_MISC_PULSE_CLR | 48 + AM35XX_CPGMAC_C0_RX_THRESH_CLR); 49 + omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR); 50 + regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 51 + } 52 + 53 + static void am35xx_disable_emac_int(void) 54 + { 55 + u32 regval; 56 + 57 + regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 58 + regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR | 59 + AM35XX_CPGMAC_C0_TX_PULSE_CLR); 60 + omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR); 61 + regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 62 + } 63 + 64 + static struct emac_platform_data am35xx_emac_pdata = { 65 + .ctrl_reg_offset = AM35XX_EMAC_CNTRL_OFFSET, 66 + .ctrl_mod_reg_offset = AM35XX_EMAC_CNTRL_MOD_OFFSET, 67 + .ctrl_ram_offset = AM35XX_EMAC_CNTRL_RAM_OFFSET, 68 + .ctrl_ram_size = AM35XX_EMAC_CNTRL_RAM_SIZE, 69 + .hw_ram_addr = AM35XX_EMAC_HW_RAM_ADDR, 70 + .version = EMAC_VERSION_2, 71 + .interrupt_enable = am35xx_enable_emac_int, 72 + .interrupt_disable = am35xx_disable_emac_int, 73 + }; 74 + 75 + static struct resource am35xx_emac_resources[] = { 76 + DEFINE_RES_MEM(AM35XX_IPSS_EMAC_BASE, 0x30000), 77 + DEFINE_RES_IRQ(INT_35XX_EMAC_C0_RXTHRESH_IRQ), 78 + DEFINE_RES_IRQ(INT_35XX_EMAC_C0_RX_PULSE_IRQ), 79 + DEFINE_RES_IRQ(INT_35XX_EMAC_C0_TX_PULSE_IRQ), 80 + DEFINE_RES_IRQ(INT_35XX_EMAC_C0_MISC_PULSE_IRQ), 81 + }; 82 + 83 + static struct platform_device am35xx_emac_device = { 84 + .name = "davinci_emac", 85 + .id = -1, 86 + .num_resources = ARRAY_SIZE(am35xx_emac_resources), 87 + .resource = am35xx_emac_resources, 88 + .dev = { 89 + .platform_data = &am35xx_emac_pdata, 90 + }, 91 + }; 92 + 93 + void __init am35xx_emac_init(unsigned long mdio_bus_freq, u8 rmii_en) 94 + { 95 + unsigned int regval; 96 + int err; 97 + 98 + am35xx_emac_pdata.rmii_en = rmii_en; 99 + am35xx_emac_mdio_pdata.bus_freq = mdio_bus_freq; 100 + err = platform_device_register(&am35xx_emac_device); 101 + if (err) { 102 + pr_err("AM35x: failed registering EMAC device: %d\n", err); 103 + return; 104 + } 105 + 106 + err = platform_device_register(&am35xx_emac_mdio_device); 107 + if (err) { 108 + pr_err("AM35x: failed registering EMAC MDIO device: %d\n", err); 109 + platform_device_unregister(&am35xx_emac_device); 110 + return; 111 + } 112 + 113 + regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); 114 + regval = regval & (~(AM35XX_CPGMACSS_SW_RST)); 115 + omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET); 116 + regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); 117 + }
+15
arch/arm/mach-omap2/am35xx-emac.h
··· 1 + /* 2 + * Copyright (C) 2011 Ilya Yanok, Emcraft Systems 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 as 6 + * published by the Free Software Foundation. 7 + */ 8 + 9 + #define AM35XX_DEFAULT_MDIO_FREQUENCY 1000000 10 + 11 + #if defined(CONFIG_TI_DAVINCI_EMAC) || defined(CONFIG_TI_DAVINCI_EMAC_MODULE) 12 + void am35xx_emac_init(unsigned long mdio_bus_freq, u8 rmii_en); 13 + #else 14 + static inline void am35xx_emac_init(unsigned long mdio_bus_freq, u8 rmii_en) {} 15 + #endif
+4 -1
arch/arm/mach-omap2/board-4430sdp.c
··· 324 324 .bus_num = 1, 325 325 .chip_select = 0, 326 326 .max_speed_hz = 24000000, 327 - .irq = ETH_KS8851_IRQ, 327 + /* 328 + * .irq is set to gpio_to_irq(ETH_KS8851_IRQ) 329 + * in omap_4430sdp_init 330 + */ 328 331 }, 329 332 }; 330 333
+2 -115
arch/arm/mach-omap2/board-am3517evm.c
··· 39 39 #include <video/omap-panel-generic-dpi.h> 40 40 #include <video/omap-panel-dvi.h> 41 41 42 + #include "am35xx-emac.h" 42 43 #include "mux.h" 43 44 #include "control.h" 44 45 #include "hsmmc.h" 45 - 46 - #define AM35XX_EVM_MDIO_FREQUENCY (1000000) 47 - 48 - static struct mdio_platform_data am3517_evm_mdio_pdata = { 49 - .bus_freq = AM35XX_EVM_MDIO_FREQUENCY, 50 - }; 51 - 52 - static struct resource am3517_mdio_resources[] = { 53 - { 54 - .start = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET, 55 - .end = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET + 56 - SZ_4K - 1, 57 - .flags = IORESOURCE_MEM, 58 - }, 59 - }; 60 - 61 - static struct platform_device am3517_mdio_device = { 62 - .name = "davinci_mdio", 63 - .id = 0, 64 - .num_resources = ARRAY_SIZE(am3517_mdio_resources), 65 - .resource = am3517_mdio_resources, 66 - .dev.platform_data = &am3517_evm_mdio_pdata, 67 - }; 68 - 69 - static struct emac_platform_data am3517_evm_emac_pdata = { 70 - .rmii_en = 1, 71 - }; 72 - 73 - static struct resource am3517_emac_resources[] = { 74 - { 75 - .start = AM35XX_IPSS_EMAC_BASE, 76 - .end = AM35XX_IPSS_EMAC_BASE + 0x2FFFF, 77 - .flags = IORESOURCE_MEM, 78 - }, 79 - { 80 - .start = INT_35XX_EMAC_C0_RXTHRESH_IRQ, 81 - .end = INT_35XX_EMAC_C0_RXTHRESH_IRQ, 82 - .flags = IORESOURCE_IRQ, 83 - }, 84 - { 85 - .start = INT_35XX_EMAC_C0_RX_PULSE_IRQ, 86 - .end = INT_35XX_EMAC_C0_RX_PULSE_IRQ, 87 - .flags = IORESOURCE_IRQ, 88 - }, 89 - { 90 - .start = INT_35XX_EMAC_C0_TX_PULSE_IRQ, 91 - .end = INT_35XX_EMAC_C0_TX_PULSE_IRQ, 92 - .flags = IORESOURCE_IRQ, 93 - }, 94 - { 95 - .start = INT_35XX_EMAC_C0_MISC_PULSE_IRQ, 96 - .end = INT_35XX_EMAC_C0_MISC_PULSE_IRQ, 97 - .flags = IORESOURCE_IRQ, 98 - }, 99 - }; 100 - 101 - static struct platform_device am3517_emac_device = { 102 - .name = "davinci_emac", 103 - .id = -1, 104 - .num_resources = ARRAY_SIZE(am3517_emac_resources), 105 - .resource = am3517_emac_resources, 106 - }; 107 - 108 - static void am3517_enable_ethernet_int(void) 109 - { 110 - u32 regval; 111 - 112 - regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 113 - regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR | 114 - AM35XX_CPGMAC_C0_TX_PULSE_CLR | 115 - AM35XX_CPGMAC_C0_MISC_PULSE_CLR | 116 - AM35XX_CPGMAC_C0_RX_THRESH_CLR); 117 - omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR); 118 - regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 119 - } 120 - 121 - static void am3517_disable_ethernet_int(void) 122 - { 123 - u32 regval; 124 - 125 - regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 126 - regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR | 127 - AM35XX_CPGMAC_C0_TX_PULSE_CLR); 128 - omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR); 129 - regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); 130 - } 131 - 132 - static void am3517_evm_ethernet_init(struct emac_platform_data *pdata) 133 - { 134 - unsigned int regval; 135 - 136 - pdata->ctrl_reg_offset = AM35XX_EMAC_CNTRL_OFFSET; 137 - pdata->ctrl_mod_reg_offset = AM35XX_EMAC_CNTRL_MOD_OFFSET; 138 - pdata->ctrl_ram_offset = AM35XX_EMAC_CNTRL_RAM_OFFSET; 139 - pdata->ctrl_ram_size = AM35XX_EMAC_CNTRL_RAM_SIZE; 140 - pdata->version = EMAC_VERSION_2; 141 - pdata->hw_ram_addr = AM35XX_EMAC_HW_RAM_ADDR; 142 - pdata->interrupt_enable = am3517_enable_ethernet_int; 143 - pdata->interrupt_disable = am3517_disable_ethernet_int; 144 - am3517_emac_device.dev.platform_data = pdata; 145 - platform_device_register(&am3517_emac_device); 146 - platform_device_register(&am3517_mdio_device); 147 - clk_add_alias(NULL, dev_name(&am3517_mdio_device.dev), 148 - NULL, &am3517_emac_device.dev); 149 - 150 - regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); 151 - regval = regval & (~(AM35XX_CPGMACSS_SW_RST)); 152 - omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET); 153 - regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); 154 - 155 - return ; 156 - } 157 - 158 - 159 46 160 47 #define LCD_PANEL_PWR 176 161 48 #define LCD_PANEL_BKLIGHT_PWR 182 ··· 385 498 i2c_register_board_info(1, am3517evm_i2c1_boardinfo, 386 499 ARRAY_SIZE(am3517evm_i2c1_boardinfo)); 387 500 /*Ethernet*/ 388 - am3517_evm_ethernet_init(&am3517_evm_emac_pdata); 501 + am35xx_emac_init(AM35XX_DEFAULT_MDIO_FREQUENCY, 1); 389 502 390 503 /* MUSB */ 391 504 am3517_evm_musb_init();
+2
arch/arm/mach-omap2/board-cm-t3517.c
··· 49 49 #include "mux.h" 50 50 #include "control.h" 51 51 #include "common-board-devices.h" 52 + #include "am35xx-emac.h" 52 53 53 54 #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) 54 55 static struct gpio_led cm_t3517_leds[] = { ··· 292 291 cm_t3517_init_rtc(); 293 292 cm_t3517_init_usbh(); 294 293 cm_t3517_init_hecc(); 294 + am35xx_emac_init(AM35XX_DEFAULT_MDIO_FREQUENCY, 1); 295 295 } 296 296 297 297 MACHINE_START(CM_T3517, "Compulab CM-T3517")
+2
arch/arm/mach-omap2/board-omap3logic.c
··· 205 205 206 206 MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board") 207 207 .atag_offset = 0x100, 208 + .reserve = omap_reserve, 208 209 .map_io = omap3_map_io, 209 210 .init_early = omap35xx_init_early, 210 211 .init_irq = omap3_init_irq, ··· 217 216 218 217 MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") 219 218 .atag_offset = 0x100, 219 + .reserve = omap_reserve, 220 220 .map_io = omap3_map_io, 221 221 .init_early = omap35xx_init_early, 222 222 .init_irq = omap3_init_irq,
+11
arch/arm/mach-omap2/board-omap3pandora.c
··· 121 121 }, 122 122 }; 123 123 124 + static struct platform_device pandora_backlight = { 125 + .name = "pandora-backlight", 126 + .id = -1, 127 + }; 128 + 124 129 #define GPIO_BUTTON(gpio_num, ev_type, ev_code, act_low, descr) \ 125 130 { \ 126 131 .gpio = gpio_num, \ ··· 483 478 484 479 static struct twl4030_bci_platform_data pandora_bci_data; 485 480 481 + static struct twl4030_power_data pandora_power_data = { 482 + .use_poweroff = true, 483 + }; 484 + 486 485 static struct twl4030_platform_data omap3pandora_twldata = { 487 486 .gpio = &omap3pandora_gpio_data, 488 487 .vmmc1 = &pandora_vmmc1, ··· 497 488 .vsim = &pandora_vsim, 498 489 .keypad = &pandora_kp_data, 499 490 .bci = &pandora_bci_data, 491 + .power = &pandora_power_data, 500 492 }; 501 493 502 494 static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = { ··· 569 559 &pandora_leds_gpio, 570 560 &pandora_keys_gpio, 571 561 &pandora_vwlan_device, 562 + &pandora_backlight, 572 563 }; 573 564 574 565 static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
+6
arch/arm/mach-omap2/board-omap4panda.c
··· 116 116 }, 117 117 }; 118 118 119 + static struct platform_device btwilink_device = { 120 + .name = "btwilink", 121 + .id = -1, 122 + }; 123 + 119 124 static struct platform_device *panda_devices[] __initdata = { 120 125 &leds_gpio, 121 126 &wl1271_device, 122 127 &panda_abe_audio, 128 + &btwilink_device, 123 129 }; 124 130 125 131 static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
+13 -1
arch/arm/mach-omap2/board-rm680.c
··· 1 1 /* 2 - * Board support file for Nokia RM-680. 2 + * Board support file for Nokia RM-680/696. 3 3 * 4 4 * Copyright (C) 2010 Nokia 5 5 * ··· 144 144 } 145 145 146 146 MACHINE_START(NOKIA_RM680, "Nokia RM-680 board") 147 + .atag_offset = 0x100, 148 + .reserve = omap_reserve, 149 + .map_io = omap3_map_io, 150 + .init_early = omap3630_init_early, 151 + .init_irq = omap3_init_irq, 152 + .handle_irq = omap3_intc_handle_irq, 153 + .init_machine = rm680_init, 154 + .timer = &omap3_timer, 155 + .restart = omap_prcm_restart, 156 + MACHINE_END 157 + 158 + MACHINE_START(NOKIA_RM696, "Nokia RM-696 board") 147 159 .atag_offset = 0x100, 148 160 .reserve = omap_reserve, 149 161 .map_io = omap3_map_io,
+14 -11
arch/arm/mach-omap2/board-rx51-peripherals.c
··· 1102 1102 .esd_timeout_ms = 8000, 1103 1103 }; 1104 1104 1105 + static struct gpio rx51_tsc2005_gpios[] __initdata = { 1106 + { RX51_TSC2005_IRQ_GPIO, GPIOF_IN, "tsc2005 IRQ" }, 1107 + { RX51_TSC2005_RESET_GPIO, GPIOF_OUT_INIT_HIGH, "tsc2005 reset" }, 1108 + }; 1109 + 1105 1110 static void rx51_tsc2005_set_reset(bool enable) 1106 1111 { 1107 1112 gpio_set_value(RX51_TSC2005_RESET_GPIO, enable); ··· 1116 1111 { 1117 1112 int r; 1118 1113 1119 - r = gpio_request_one(RX51_TSC2005_IRQ_GPIO, GPIOF_IN, "tsc2005 IRQ"); 1114 + omap_mux_init_gpio(RX51_TSC2005_RESET_GPIO, OMAP_PIN_OUTPUT); 1115 + omap_mux_init_gpio(RX51_TSC2005_IRQ_GPIO, OMAP_PIN_INPUT_PULLUP); 1116 + 1117 + r = gpio_request_array(rx51_tsc2005_gpios, 1118 + ARRAY_SIZE(rx51_tsc2005_gpios)); 1120 1119 if (r < 0) { 1121 - printk(KERN_ERR "unable to get %s GPIO\n", "tsc2005 IRQ"); 1122 - rx51_peripherals_spi_board_info[RX51_SPI_TSC2005].irq = 0; 1120 + printk(KERN_ERR "tsc2005 board initialization failed\n"); 1121 + tsc2005_pdata.esd_timeout_ms = 0; 1122 + return; 1123 1123 } 1124 1124 1125 - r = gpio_request_one(RX51_TSC2005_RESET_GPIO, GPIOF_OUT_INIT_HIGH, 1126 - "tsc2005 reset"); 1127 - if (r >= 0) { 1128 - tsc2005_pdata.set_reset = rx51_tsc2005_set_reset; 1129 - } else { 1130 - printk(KERN_ERR "unable to get %s GPIO\n", "tsc2005 reset"); 1131 - tsc2005_pdata.esd_timeout_ms = 0; 1132 - } 1125 + tsc2005_pdata.set_reset = rx51_tsc2005_set_reset; 1133 1126 } 1134 1127 1135 1128 void __init rx51_peripherals_init(void)
+23 -21
arch/arm/mach-pxa/hx4700.c
··· 97 97 98 98 /* BTUART */ 99 99 GPIO42_BTUART_RXD, 100 - GPIO43_BTUART_TXD, 100 + GPIO43_BTUART_TXD_LPM_LOW, 101 101 GPIO44_BTUART_CTS, 102 - GPIO45_BTUART_RTS, 102 + GPIO45_BTUART_RTS_LPM_LOW, 103 103 104 104 /* PWM 1 (Backlight) */ 105 105 GPIO17_PWM1_OUT, ··· 245 245 ASIC3_GPIOD15_nPIOW, 246 246 }; 247 247 248 + static struct asic3_led asic3_leds[ASIC3_NUM_LEDS] = { 249 + [0] = { 250 + .name = "hx4700:amber", 251 + .default_trigger = "ds2760-battery.0-charging-blink-full-solid", 252 + }, 253 + [1] = { 254 + .name = "hx4700:green", 255 + .default_trigger = "unused", 256 + }, 257 + [2] = { 258 + .name = "hx4700:blue", 259 + .default_trigger = "hx4700-radio", 260 + }, 261 + }; 262 + 248 263 static struct resource asic3_resources[] = { 249 264 /* GPIO part */ 250 265 [0] = { ··· 290 275 .gpio_config_num = ARRAY_SIZE(asic3_gpio_config), 291 276 .irq_base = IRQ_BOARD_START, 292 277 .gpio_base = HX4700_ASIC3_GPIO_BASE, 278 + .leds = asic3_leds, 293 279 }; 294 280 295 281 static struct platform_device asic3 = { ··· 721 705 gpio_set_value(GPIO91_HX4700_FLASH_VPEN, vpp); 722 706 } 723 707 724 - static struct resource strataflash_resource = { 725 - .start = PXA_CS0_PHYS, 726 - .end = PXA_CS0_PHYS + SZ_128M - 1, 727 - .flags = IORESOURCE_MEM, 708 + static struct resource strataflash_resource[] = { 709 + [0] = DEFINE_RES_MEM(PXA_CS0_PHYS, SZ_64M), 710 + [1] = DEFINE_RES_MEM(PXA_CS0_PHYS + SZ_64M, SZ_64M), 728 711 }; 729 712 730 713 static struct physmap_flash_data strataflash_data = { ··· 734 719 static struct platform_device strataflash = { 735 720 .name = "physmap-flash", 736 721 .id = -1, 737 - .resource = &strataflash_resource, 738 - .num_resources = 1, 722 + .resource = strataflash_resource, 723 + .num_resources = ARRAY_SIZE(strataflash_resource), 739 724 .dev = { 740 725 .platform_data = &strataflash_data, 741 726 }, ··· 803 788 804 789 805 790 /* 806 - * PCMCIA 807 - */ 808 - 809 - static struct platform_device pcmcia = { 810 - .name = "hx4700-pcmcia", 811 - .dev = { 812 - .parent = &asic3.dev, 813 - }, 814 - }; 815 - 816 - /* 817 791 * Platform devices 818 792 */ 819 793 ··· 818 814 &power_supply, 819 815 &strataflash, 820 816 &audio, 821 - &pcmcia, 822 817 }; 823 818 824 819 static struct gpio global_gpios[] = { ··· 833 830 { GPIO32_HX4700_RS232_ON, GPIOF_OUT_INIT_HIGH, "RS232_ON" }, 834 831 { GPIO71_HX4700_ASIC3_nRESET, GPIOF_OUT_INIT_HIGH, "ASIC3_nRESET" }, 835 832 { GPIO82_HX4700_EUART_RESET, GPIOF_OUT_INIT_HIGH, "EUART_RESET" }, 836 - { GPIO105_HX4700_nIR_ON, GPIOF_OUT_INIT_HIGH, "nIR_EN" }, 837 833 }; 838 834 839 835 static void __init hx4700_init(void)
+2
arch/arm/mach-pxa/include/mach/mfp-pxa27x.h
··· 158 158 #define GPIO44_BTUART_CTS MFP_CFG_IN(GPIO44, AF1) 159 159 #define GPIO42_BTUART_RXD MFP_CFG_IN(GPIO42, AF1) 160 160 #define GPIO45_BTUART_RTS MFP_CFG_OUT(GPIO45, AF2, DRIVE_HIGH) 161 + #define GPIO45_BTUART_RTS_LPM_LOW MFP_CFG_OUT(GPIO45, AF2, DRIVE_LOW) 161 162 #define GPIO43_BTUART_TXD MFP_CFG_OUT(GPIO43, AF2, DRIVE_HIGH) 163 + #define GPIO43_BTUART_TXD_LPM_LOW MFP_CFG_OUT(GPIO43, AF2, DRIVE_LOW) 162 164 163 165 /* STUART */ 164 166 #define GPIO46_STUART_RXD MFP_CFG_IN(GPIO46, AF2)
+1
arch/arm/mach-s3c64xx/Kconfig
··· 304 304 select S3C64XX_DEV_SPI0 305 305 select SAMSUNG_GPIO_EXTRA128 306 306 select I2C 307 + select LEDS_GPIO_REGISTER 307 308 help 308 309 Machine support for the Wolfson Cragganmore S3C6410 variant.
+30 -1
arch/arm/mach-s3c64xx/mach-crag6410-module.c
··· 11 11 #include <linux/export.h> 12 12 #include <linux/interrupt.h> 13 13 #include <linux/i2c.h> 14 + #include <linux/spi/spi.h> 14 15 15 16 #include <linux/mfd/wm831x/irq.h> 16 17 #include <linux/mfd/wm831x/gpio.h> ··· 22 21 #include <sound/wm8962.h> 23 22 #include <sound/wm9081.h> 24 23 24 + #include <plat/s3c64xx-spi.h> 25 + 25 26 #include <mach/crag6410.h> 27 + 28 + static struct s3c64xx_spi_csinfo wm0010_spi_csinfo = { 29 + .set_level = gpio_set_value, 30 + .line = S3C64XX_GPC(3), 31 + }; 32 + 33 + static struct spi_board_info wm1253_devs[] = { 34 + [0] = { 35 + .modalias = "wm0010", 36 + .bus_num = 0, 37 + .chip_select = 0, 38 + .mode = SPI_MODE_0, 39 + .controller_data = &wm0010_spi_csinfo, 40 + }, 41 + }; 26 42 27 43 static struct wm5100_pdata wm5100_pdata = { 28 44 .ldo_ena = S3C64XX_GPN(7), ··· 177 159 const char *name; 178 160 const struct i2c_board_info *i2c_devs; 179 161 int num_i2c_devs; 162 + const struct spi_board_info *spi_devs; 163 + int num_spi_devs; 180 164 } gf_mods[] = { 181 165 { .id = 0x01, .name = "1250-EV1 Springbank" }, 182 166 { .id = 0x02, .name = "1251-EV1 Jura" }, 183 167 { .id = 0x03, .name = "1252-EV1 Glenlivet" }, 184 168 { .id = 0x11, .name = "6249-EV2 Glenfarclas", }, 169 + { .id = 0x14, .name = "6271-EV1 Lochnagar" }, 170 + { .id = 0x15, .name = "XXXX-EV1 Bells" }, 185 171 { .id = 0x21, .name = "1275-EV1 Mortlach" }, 186 172 { .id = 0x25, .name = "1274-EV1 Glencadam" }, 187 - { .id = 0x31, .name = "1253-EV1 Tomatin", }, 173 + { .id = 0x31, .name = "1253-EV1 Tomatin", 174 + .spi_devs = wm1253_devs, .num_spi_devs = ARRAY_SIZE(wm1253_devs) }, 175 + { .id = 0x32, .name = "XXXX-EV1 Caol Illa" }, 176 + { .id = 0x33, .name = "XXXX-EV1 Oban" }, 188 177 { .id = 0x39, .name = "1254-EV1 Dallas Dhu", 189 178 .i2c_devs = wm1254_devs, .num_i2c_devs = ARRAY_SIZE(wm1254_devs) }, 190 179 { .id = 0x3a, .name = "1259-EV1 Tobermory", ··· 223 198 if (i < ARRAY_SIZE(gf_mods)) { 224 199 dev_info(&i2c->dev, "%s revision %d\n", 225 200 gf_mods[i].name, rev + 1); 201 + 226 202 for (j = 0; j < gf_mods[i].num_i2c_devs; j++) { 227 203 if (!i2c_new_device(i2c->adapter, 228 204 &(gf_mods[i].i2c_devs[j]))) 229 205 dev_err(&i2c->dev, 230 206 "Failed to register dev: %d\n", ret); 231 207 } 208 + 209 + spi_register_board_info(gf_mods[i].spi_devs, 210 + gf_mods[i].num_spi_devs); 232 211 } else { 233 212 dev_warn(&i2c->dev, "Unknown module ID 0x%x revision %d\n", 234 213 id, rev + 1);
+66 -1
arch/arm/mach-s3c64xx/mach-crag6410.c
··· 19 19 #include <linux/io.h> 20 20 #include <linux/init.h> 21 21 #include <linux/gpio.h> 22 + #include <linux/leds.h> 22 23 #include <linux/delay.h> 24 + #include <linux/mmc/host.h> 23 25 #include <linux/regulator/machine.h> 24 26 #include <linux/regulator/fixed.h> 25 27 #include <linux/pwm_backlight.h> ··· 301 299 }; 302 300 303 301 static struct regulator_consumer_supply wallvdd_consumers[] = { 302 + REGULATOR_SUPPLY("SPKVDD", "1-001a"), 304 303 REGULATOR_SUPPLY("SPKVDD1", "1-001a"), 305 304 REGULATOR_SUPPLY("SPKVDD2", "1-001a"), 306 305 REGULATOR_SUPPLY("SPKVDDL", "1-001a"), ··· 578 575 .frequency = 400000, 579 576 }; 580 577 578 + static struct regulator_consumer_supply pvdd_1v2_consumers[] __initdata = { 579 + REGULATOR_SUPPLY("DCVDD", "spi0.0"), 580 + REGULATOR_SUPPLY("AVDD", "spi0.0"), 581 + }; 582 + 581 583 static struct regulator_init_data pvdd_1v2 __initdata = { 582 584 .constraints = { 583 585 .name = "PVDD_1V2", 584 - .always_on = 1, 586 + .valid_ops_mask = REGULATOR_CHANGE_STATUS, 585 587 }, 588 + 589 + .consumer_supplies = pvdd_1v2_consumers, 590 + .num_consumer_supplies = ARRAY_SIZE(pvdd_1v2_consumers), 586 591 }; 587 592 588 593 static struct regulator_consumer_supply pvdd_1v8_consumers[] __initdata = { ··· 604 593 REGULATOR_SUPPLY("AVDD2", "1-001a"), 605 594 REGULATOR_SUPPLY("DCVDD", "1-001a"), 606 595 REGULATOR_SUPPLY("AVDD", "1-001a"), 596 + REGULATOR_SUPPLY("DBVDD", "spi0.0"), 607 597 }; 608 598 609 599 static struct regulator_init_data pvdd_1v8 __initdata = { ··· 694 682 static struct s3c_sdhci_platdata crag6410_hsmmc2_pdata = { 695 683 .max_width = 4, 696 684 .cd_type = S3C_SDHCI_CD_PERMANENT, 685 + .host_caps = MMC_CAP_POWER_OFF_CARD, 697 686 }; 698 687 699 688 static void crag6410_cfg_sdhci0(struct platform_device *dev, int width) ··· 710 697 .max_width = 4, 711 698 .cd_type = S3C_SDHCI_CD_INTERNAL, 712 699 .cfg_gpio = crag6410_cfg_sdhci0, 700 + .host_caps = MMC_CAP_POWER_OFF_CARD, 701 + }; 702 + 703 + static const struct gpio_led gpio_leds[] = { 704 + { 705 + .name = "d13:green:", 706 + .gpio = MMGPIO_GPIO_BASE + 0, 707 + .default_state = LEDS_GPIO_DEFSTATE_ON, 708 + }, 709 + { 710 + .name = "d14:green:", 711 + .gpio = MMGPIO_GPIO_BASE + 1, 712 + .default_state = LEDS_GPIO_DEFSTATE_ON, 713 + }, 714 + { 715 + .name = "d15:green:", 716 + .gpio = MMGPIO_GPIO_BASE + 2, 717 + .default_state = LEDS_GPIO_DEFSTATE_ON, 718 + }, 719 + { 720 + .name = "d16:green:", 721 + .gpio = MMGPIO_GPIO_BASE + 3, 722 + .default_state = LEDS_GPIO_DEFSTATE_ON, 723 + }, 724 + { 725 + .name = "d17:green:", 726 + .gpio = MMGPIO_GPIO_BASE + 4, 727 + .default_state = LEDS_GPIO_DEFSTATE_ON, 728 + }, 729 + { 730 + .name = "d18:green:", 731 + .gpio = MMGPIO_GPIO_BASE + 5, 732 + .default_state = LEDS_GPIO_DEFSTATE_ON, 733 + }, 734 + { 735 + .name = "d19:green:", 736 + .gpio = MMGPIO_GPIO_BASE + 6, 737 + .default_state = LEDS_GPIO_DEFSTATE_ON, 738 + }, 739 + { 740 + .name = "d20:green:", 741 + .gpio = MMGPIO_GPIO_BASE + 7, 742 + .default_state = LEDS_GPIO_DEFSTATE_ON, 743 + }, 744 + }; 745 + 746 + static const struct gpio_led_platform_data gpio_leds_pdata = { 747 + .leds = gpio_leds, 748 + .num_leds = ARRAY_SIZE(gpio_leds), 713 749 }; 714 750 715 751 static struct s3c_hsotg_plat crag6410_hsotg_pdata; ··· 793 731 i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1)); 794 732 795 733 samsung_keypad_set_platdata(&crag6410_keypad_data); 734 + s3c64xx_spi0_set_platdata(&s3c64xx_spi0_pdata, 0, 1); 796 735 797 736 platform_add_devices(crag6410_devices, ARRAY_SIZE(crag6410_devices)); 737 + 738 + gpio_led_register_device(-1, &gpio_leds_pdata); 798 739 799 740 regulator_has_full_constraints(); 800 741
+9
arch/arm/mach-s5pv210/Kconfig
··· 124 124 select S3C_DEV_I2C2 125 125 select S3C_DEV_RTC 126 126 select S3C_DEV_WDT 127 + select S5P_DEV_FIMC0 128 + select S5P_DEV_FIMC1 129 + select S5P_DEV_FIMC2 130 + select S5P_DEV_MFC 127 131 select SAMSUNG_DEV_IDE 128 132 select S5PV210_SETUP_I2C1 129 133 select S5PV210_SETUP_I2C2 ··· 152 148 select S3C_DEV_I2C2 153 149 select S3C_DEV_RTC 154 150 select S3C_DEV_WDT 151 + select S5P_DEV_FIMC0 152 + select S5P_DEV_FIMC1 153 + select S5P_DEV_FIMC2 154 + select S5P_DEV_JPEG 155 + select S5P_DEV_MFC 155 156 select SAMSUNG_DEV_ADC 156 157 select SAMSUNG_DEV_BACKLIGHT 157 158 select SAMSUNG_DEV_IDE
+5
arch/arm/mach-s5pv210/clock.c
··· 340 340 .enable = s5pv210_clk_ip0_ctrl, 341 341 .ctrlbit = (1 << 26), 342 342 }, { 343 + .name = "jpeg", 344 + .parent = &clk_hclk_dsys.clk, 345 + .enable = s5pv210_clk_ip0_ctrl, 346 + .ctrlbit = (1 << 28), 347 + }, { 343 348 .name = "mfc", 344 349 .devname = "s5p-mfc", 345 350 .parent = &clk_pclk_psys.clk,
+4
arch/arm/mach-s5pv210/include/mach/map.h
··· 90 90 #define S5PV210_PA_FIMC1 0xFB300000 91 91 #define S5PV210_PA_FIMC2 0xFB400000 92 92 93 + #define S5PV210_PA_JPEG 0xFB600000 94 + 93 95 #define S5PV210_PA_SDO 0xF9000000 94 96 #define S5PV210_PA_VP 0xF9100000 95 97 #define S5PV210_PA_MIXER 0xF9200000 ··· 133 131 #define S5P_PA_SROMC S5PV210_PA_SROMC 134 132 #define S5P_PA_SYSCON S5PV210_PA_SYSCON 135 133 #define S5P_PA_TIMER S5PV210_PA_TIMER 134 + 135 + #define S5P_PA_JPEG S5PV210_PA_JPEG 136 136 137 137 #define SAMSUNG_PA_ADC S5PV210_PA_ADC 138 138 #define SAMSUNG_PA_CFCON S5PV210_PA_CFCON
+1
arch/arm/mach-s5pv210/mach-aquila.c
··· 616 616 &s5p_device_fimc0, 617 617 &s5p_device_fimc1, 618 618 &s5p_device_fimc2, 619 + &s5p_device_fimc_md, 619 620 &s5pv210_device_iis0, 620 621 &wm8994_fixed_voltage0, 621 622 &wm8994_fixed_voltage1,
+14
arch/arm/mach-s5pv210/mach-smdkc110.c
··· 31 31 #include <plat/iic.h> 32 32 #include <plat/pm.h> 33 33 #include <plat/s5p-time.h> 34 + #include <plat/mfc.h> 34 35 35 36 #include "common.h" 36 37 ··· 95 94 &s3c_device_i2c2, 96 95 &s3c_device_rtc, 97 96 &s3c_device_wdt, 97 + &s5p_device_fimc0, 98 + &s5p_device_fimc1, 99 + &s5p_device_fimc2, 100 + &s5p_device_fimc_md, 101 + &s5p_device_mfc, 102 + &s5p_device_mfc_l, 103 + &s5p_device_mfc_r, 98 104 }; 99 105 100 106 static struct i2c_board_info smdkc110_i2c_devs0[] __initdata = { ··· 123 115 s3c24xx_init_clocks(24000000); 124 116 s3c24xx_init_uarts(smdkv210_uartcfgs, ARRAY_SIZE(smdkv210_uartcfgs)); 125 117 s5p_set_timer_source(S5P_PWM3, S5P_PWM4); 118 + } 119 + 120 + static void __init smdkc110_reserve(void) 121 + { 122 + s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20); 126 123 } 127 124 128 125 static void __init smdkc110_machine_init(void) ··· 158 145 .init_machine = smdkc110_machine_init, 159 146 .timer = &s5p_timer, 160 147 .restart = s5pv210_restart, 148 + .reserve = &smdkc110_reserve, 161 149 MACHINE_END
+15
arch/arm/mach-s5pv210/mach-smdkv210.c
··· 46 46 #include <plat/s5p-time.h> 47 47 #include <plat/backlight.h> 48 48 #include <plat/regs-fb-v4.h> 49 + #include <plat/mfc.h> 49 50 50 51 #include "common.h" 51 52 ··· 224 223 &s3c_device_rtc, 225 224 &s3c_device_ts, 226 225 &s3c_device_wdt, 226 + &s5p_device_fimc0, 227 + &s5p_device_fimc1, 228 + &s5p_device_fimc2, 229 + &s5p_device_fimc_md, 230 + &s5p_device_jpeg, 231 + &s5p_device_mfc, 232 + &s5p_device_mfc_l, 233 + &s5p_device_mfc_r, 227 234 &s5pv210_device_ac97, 228 235 &s5pv210_device_iis0, 229 236 &s5pv210_device_spdif, ··· 291 282 s5p_set_timer_source(S5P_PWM2, S5P_PWM4); 292 283 } 293 284 285 + static void __init smdkv210_reserve(void) 286 + { 287 + s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20); 288 + } 289 + 294 290 static void __init smdkv210_machine_init(void) 295 291 { 296 292 s3c_pm_init(); ··· 333 319 .init_machine = smdkv210_machine_init, 334 320 .timer = &s5p_timer, 335 321 .restart = s5pv210_restart, 322 + .reserve = &smdkv210_reserve, 336 323 MACHINE_END
+1 -5
arch/arm/mach-tegra/board-dt-tegra20.c
··· 131 131 } 132 132 133 133 static const char *tegra20_dt_board_compat[] = { 134 - "compulab,trimslice", 135 - "nvidia,harmony", 136 - "compal,paz00", 137 - "nvidia,seaboard", 138 - "nvidia,ventana", 134 + "nvidia,tegra20", 139 135 NULL 140 136 }; 141 137
+1 -1
arch/arm/mach-tegra/board-dt-tegra30.c
··· 69 69 } 70 70 71 71 static const char *tegra30_dt_board_compat[] = { 72 - "nvidia,cardhu", 72 + "nvidia,tegra30", 73 73 NULL 74 74 }; 75 75
+2 -1
arch/arm/mach-tegra/board-harmony-power.c
··· 36 36 37 37 static struct regulator_init_data ldo0_data = { 38 38 .constraints = { 39 - .min_uV = 1250 * 1000, 39 + .min_uV = 3300 * 1000, 40 40 .max_uV = 3300 * 1000, 41 41 .valid_modes_mask = (REGULATOR_MODE_NORMAL | 42 42 REGULATOR_MODE_STANDBY), 43 43 .valid_ops_mask = (REGULATOR_CHANGE_MODE | 44 44 REGULATOR_CHANGE_STATUS | 45 45 REGULATOR_CHANGE_VOLTAGE), 46 + .apply_uV = 1, 46 47 }, 47 48 .num_consumer_supplies = ARRAY_SIZE(tps658621_ldo0_supply), 48 49 .consumer_supplies = tps658621_ldo0_supply,
+22 -27
arch/arm/plat-omap/include/plat/board-ams-delta.h
··· 28 28 29 29 #if defined (CONFIG_MACH_AMS_DELTA) 30 30 31 - #define AMS_DELTA_LATCH1_PHYS 0x01000000 32 - #define AMS_DELTA_LATCH1_VIRT 0xEA000000 33 - #define AMS_DELTA_MODEM_PHYS 0x04000000 34 - #define AMS_DELTA_MODEM_VIRT 0xEB000000 35 - #define AMS_DELTA_LATCH2_PHYS 0x08000000 36 - #define AMS_DELTA_LATCH2_VIRT 0xEC000000 37 - 38 - #define AMS_DELTA_LATCH1_LED_CAMERA 0x01 39 - #define AMS_DELTA_LATCH1_LED_ADVERT 0x02 40 - #define AMS_DELTA_LATCH1_LED_EMAIL 0x04 41 - #define AMS_DELTA_LATCH1_LED_HANDSFREE 0x08 42 - #define AMS_DELTA_LATCH1_LED_VOICEMAIL 0x10 43 - #define AMS_DELTA_LATCH1_LED_VOICE 0x20 44 - 45 - #define AMS_DELTA_LATCH2_LCD_VBLEN 0x0001 46 - #define AMS_DELTA_LATCH2_LCD_NDISP 0x0002 47 - #define AMS_DELTA_LATCH2_NAND_NCE 0x0004 48 - #define AMS_DELTA_LATCH2_NAND_NRE 0x0008 49 - #define AMS_DELTA_LATCH2_NAND_NWP 0x0010 50 - #define AMS_DELTA_LATCH2_NAND_NWE 0x0020 51 - #define AMS_DELTA_LATCH2_NAND_ALE 0x0040 52 - #define AMS_DELTA_LATCH2_NAND_CLE 0x0080 53 - #define AMD_DELTA_LATCH2_KEYBRD_PWR 0x0100 54 - #define AMD_DELTA_LATCH2_KEYBRD_DATA 0x0200 55 31 #define AMD_DELTA_LATCH2_SCARD_RSTIN 0x0400 56 32 #define AMD_DELTA_LATCH2_SCARD_CMDVCC 0x0800 57 - #define AMS_DELTA_LATCH2_MODEM_NRESET 0x1000 58 33 #define AMS_DELTA_LATCH2_MODEM_CODEC 0x2000 59 34 60 35 #define AMS_DELTA_GPIO_PIN_KEYBRD_DATA 0 ··· 41 66 #define AMS_DELTA_GPIO_PIN_CONFIG 11 42 67 #define AMS_DELTA_GPIO_PIN_NAND_RB 12 43 68 69 + #define AMS_DELTA_GPIO_PIN_LCD_VBLEN 240 70 + #define AMS_DELTA_GPIO_PIN_LCD_NDISP 241 71 + #define AMS_DELTA_GPIO_PIN_NAND_NCE 242 72 + #define AMS_DELTA_GPIO_PIN_NAND_NRE 243 73 + #define AMS_DELTA_GPIO_PIN_NAND_NWP 244 74 + #define AMS_DELTA_GPIO_PIN_NAND_NWE 245 75 + #define AMS_DELTA_GPIO_PIN_NAND_ALE 246 76 + #define AMS_DELTA_GPIO_PIN_NAND_CLE 247 77 + #define AMS_DELTA_GPIO_PIN_KEYBRD_PWR 248 78 + #define AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT 249 79 + #define AMS_DELTA_GPIO_PIN_SCARD_RSTIN 250 80 + #define AMS_DELTA_GPIO_PIN_SCARD_CMDVCC 251 81 + #define AMS_DELTA_GPIO_PIN_MODEM_NRESET 252 82 + #define AMS_DELTA_GPIO_PIN_MODEM_CODEC 253 83 + 84 + #define AMS_DELTA_LATCH2_GPIO_BASE AMS_DELTA_GPIO_PIN_LCD_VBLEN 85 + #define AMS_DELTA_LATCH2_NGPIO 16 86 + 44 87 #ifndef __ASSEMBLY__ 45 - void ams_delta_latch1_write(u8 mask, u8 value); 46 - void ams_delta_latch2_write(u16 mask, u16 value); 88 + void ams_delta_latch_write(int base, int ngpio, u16 mask, u16 value); 89 + #define ams_delta_latch2_write(mask, value) \ 90 + ams_delta_latch_write(AMS_DELTA_LATCH2_GPIO_BASE, \ 91 + AMS_DELTA_LATCH2_NGPIO, (mask), (value)) 47 92 #endif 48 93 49 94 #endif /* CONFIG_MACH_AMS_DELTA */
+1
arch/arm/plat-omap/include/plat/uncompress.h
··· 160 160 DEBUG_LL_OMAP3(3, igep0020); 161 161 DEBUG_LL_OMAP3(3, igep0030); 162 162 DEBUG_LL_OMAP3(3, nokia_rm680); 163 + DEBUG_LL_OMAP3(3, nokia_rm696); 163 164 DEBUG_LL_OMAP3(3, nokia_rx51); 164 165 DEBUG_LL_OMAP3(3, omap3517evm); 165 166 DEBUG_LL_OMAP3(3, omap3_beagle);
+34 -20
drivers/input/serio/ams_delta_serio.c
··· 92 92 static int ams_delta_serio_open(struct serio *serio) 93 93 { 94 94 /* enable keyboard */ 95 - ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR, 96 - AMD_DELTA_LATCH2_KEYBRD_PWR); 95 + gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 1); 97 96 98 97 return 0; 99 98 } ··· 100 101 static void ams_delta_serio_close(struct serio *serio) 101 102 { 102 103 /* disable keyboard */ 103 - ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR, 0); 104 + gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 0); 104 105 } 106 + 107 + static const struct gpio ams_delta_gpios[] __initconst_or_module = { 108 + { 109 + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATA, 110 + .flags = GPIOF_DIR_IN, 111 + .label = "serio-data", 112 + }, 113 + { 114 + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_CLK, 115 + .flags = GPIOF_DIR_IN, 116 + .label = "serio-clock", 117 + }, 118 + { 119 + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 120 + .flags = GPIOF_OUT_INIT_LOW, 121 + .label = "serio-power", 122 + }, 123 + { 124 + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT, 125 + .flags = GPIOF_OUT_INIT_LOW, 126 + .label = "serio-dataout", 127 + }, 128 + }; 105 129 106 130 static int __init ams_delta_serio_init(void) 107 131 { ··· 145 123 strlcpy(ams_delta_serio->phys, "GPIO/serio0", 146 124 sizeof(ams_delta_serio->phys)); 147 125 148 - err = gpio_request(AMS_DELTA_GPIO_PIN_KEYBRD_DATA, "serio-data"); 126 + err = gpio_request_array(ams_delta_gpios, 127 + ARRAY_SIZE(ams_delta_gpios)); 149 128 if (err) { 150 - pr_err("ams_delta_serio: Couldn't request gpio pin for data\n"); 129 + pr_err("ams_delta_serio: Couldn't request gpio pins\n"); 151 130 goto serio; 152 131 } 153 - gpio_direction_input(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); 154 - 155 - err = gpio_request(AMS_DELTA_GPIO_PIN_KEYBRD_CLK, "serio-clock"); 156 - if (err) { 157 - pr_err("ams_delta_serio: couldn't request gpio pin for clock\n"); 158 - goto gpio_data; 159 - } 160 - gpio_direction_input(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); 161 132 162 133 err = request_irq(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), 163 134 ams_delta_serio_interrupt, IRQ_TYPE_EDGE_RISING, ··· 158 143 if (err < 0) { 159 144 pr_err("ams_delta_serio: couldn't request gpio interrupt %d\n", 160 145 gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK)); 161 - goto gpio_clk; 146 + goto gpio; 162 147 } 163 148 /* 164 149 * Since GPIO register handling for keyboard clock pin is performed ··· 172 157 dev_info(&ams_delta_serio->dev, "%s\n", ams_delta_serio->name); 173 158 174 159 return 0; 175 - gpio_clk: 176 - gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); 177 - gpio_data: 178 - gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); 160 + gpio: 161 + gpio_free_array(ams_delta_gpios, 162 + ARRAY_SIZE(ams_delta_gpios)); 179 163 serio: 180 164 kfree(ams_delta_serio); 181 165 return err; ··· 185 171 { 186 172 serio_unregister_port(ams_delta_serio); 187 173 free_irq(OMAP_GPIO_IRQ(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), 0); 188 - gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); 189 - gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); 174 + gpio_free_array(ams_delta_gpios, 175 + ARRAY_SIZE(ams_delta_gpios)); 190 176 } 191 177 module_exit(ams_delta_serio_exit);
-7
drivers/leds/Kconfig
··· 74 74 This option enables support for LEDs connected to GPIO lines 75 75 on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440. 76 76 77 - config LEDS_AMS_DELTA 78 - tristate "LED Support for the Amstrad Delta (E3)" 79 - depends on LEDS_CLASS 80 - depends on MACH_AMS_DELTA 81 - help 82 - This option enables support for the LEDs on Amstrad Delta (E3). 83 - 84 77 config LEDS_NET48XX 85 78 tristate "LED Support for Soekris net48xx series Error LED" 86 79 depends on LEDS_CLASS
-1
drivers/leds/Makefile
··· 12 12 obj-$(CONFIG_LEDS_LM3530) += leds-lm3530.o 13 13 obj-$(CONFIG_LEDS_MIKROTIK_RB532) += leds-rb532.o 14 14 obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o 15 - obj-$(CONFIG_LEDS_AMS_DELTA) += leds-ams-delta.o 16 15 obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o 17 16 obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o 18 17 obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-cobalt-qube.o
-126
drivers/leds/leds-ams-delta.c
··· 1 - /* 2 - * LEDs driver for Amstrad Delta (E3) 3 - * 4 - * Copyright (C) 2006 Jonathan McDowell <noodles@earth.li> 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 version 2 as 8 - * published by the Free Software Foundation. 9 - */ 10 - 11 - #include <linux/module.h> 12 - #include <linux/kernel.h> 13 - #include <linux/init.h> 14 - #include <linux/platform_device.h> 15 - #include <linux/leds.h> 16 - #include <plat/board-ams-delta.h> 17 - 18 - /* 19 - * Our context 20 - */ 21 - struct ams_delta_led { 22 - struct led_classdev cdev; 23 - u8 bitmask; 24 - }; 25 - 26 - static void ams_delta_led_set(struct led_classdev *led_cdev, 27 - enum led_brightness value) 28 - { 29 - struct ams_delta_led *led_dev = 30 - container_of(led_cdev, struct ams_delta_led, cdev); 31 - 32 - if (value) 33 - ams_delta_latch1_write(led_dev->bitmask, led_dev->bitmask); 34 - else 35 - ams_delta_latch1_write(led_dev->bitmask, 0); 36 - } 37 - 38 - static struct ams_delta_led ams_delta_leds[] = { 39 - { 40 - .cdev = { 41 - .name = "ams-delta::camera", 42 - .brightness_set = ams_delta_led_set, 43 - }, 44 - .bitmask = AMS_DELTA_LATCH1_LED_CAMERA, 45 - }, 46 - { 47 - .cdev = { 48 - .name = "ams-delta::advert", 49 - .brightness_set = ams_delta_led_set, 50 - }, 51 - .bitmask = AMS_DELTA_LATCH1_LED_ADVERT, 52 - }, 53 - { 54 - .cdev = { 55 - .name = "ams-delta::email", 56 - .brightness_set = ams_delta_led_set, 57 - }, 58 - .bitmask = AMS_DELTA_LATCH1_LED_EMAIL, 59 - }, 60 - { 61 - .cdev = { 62 - .name = "ams-delta::handsfree", 63 - .brightness_set = ams_delta_led_set, 64 - }, 65 - .bitmask = AMS_DELTA_LATCH1_LED_HANDSFREE, 66 - }, 67 - { 68 - .cdev = { 69 - .name = "ams-delta::voicemail", 70 - .brightness_set = ams_delta_led_set, 71 - }, 72 - .bitmask = AMS_DELTA_LATCH1_LED_VOICEMAIL, 73 - }, 74 - { 75 - .cdev = { 76 - .name = "ams-delta::voice", 77 - .brightness_set = ams_delta_led_set, 78 - }, 79 - .bitmask = AMS_DELTA_LATCH1_LED_VOICE, 80 - }, 81 - }; 82 - 83 - static int ams_delta_led_probe(struct platform_device *pdev) 84 - { 85 - int i, ret; 86 - 87 - for (i = 0; i < ARRAY_SIZE(ams_delta_leds); i++) { 88 - ams_delta_leds[i].cdev.flags |= LED_CORE_SUSPENDRESUME; 89 - ret = led_classdev_register(&pdev->dev, 90 - &ams_delta_leds[i].cdev); 91 - if (ret < 0) 92 - goto fail; 93 - } 94 - 95 - return 0; 96 - fail: 97 - while (--i >= 0) 98 - led_classdev_unregister(&ams_delta_leds[i].cdev); 99 - return ret; 100 - } 101 - 102 - static int ams_delta_led_remove(struct platform_device *pdev) 103 - { 104 - int i; 105 - 106 - for (i = 0; i < ARRAY_SIZE(ams_delta_leds); i++) 107 - led_classdev_unregister(&ams_delta_leds[i].cdev); 108 - 109 - return 0; 110 - } 111 - 112 - static struct platform_driver ams_delta_led_driver = { 113 - .probe = ams_delta_led_probe, 114 - .remove = ams_delta_led_remove, 115 - .driver = { 116 - .name = "ams-delta-led", 117 - .owner = THIS_MODULE, 118 - }, 119 - }; 120 - 121 - module_platform_driver(ams_delta_led_driver); 122 - 123 - MODULE_AUTHOR("Jonathan McDowell <noodles@earth.li>"); 124 - MODULE_DESCRIPTION("Amstrad Delta LED driver"); 125 - MODULE_LICENSE("GPL"); 126 - MODULE_ALIAS("platform:ams-delta-led");
+52 -22
drivers/mtd/nand/ams-delta.c
··· 26 26 #include <asm/io.h> 27 27 #include <mach/hardware.h> 28 28 #include <asm/sizes.h> 29 - #include <asm/gpio.h> 29 + #include <linux/gpio.h> 30 30 #include <plat/board-ams-delta.h> 31 31 32 32 /* 33 33 * MTD structure for E3 (Delta) 34 34 */ 35 35 static struct mtd_info *ams_delta_mtd = NULL; 36 - 37 - #define NAND_MASK (AMS_DELTA_LATCH2_NAND_NRE | AMS_DELTA_LATCH2_NAND_NWE | AMS_DELTA_LATCH2_NAND_CLE | AMS_DELTA_LATCH2_NAND_ALE | AMS_DELTA_LATCH2_NAND_NCE | AMS_DELTA_LATCH2_NAND_NWP) 38 36 39 37 /* 40 38 * Define partitions for flash devices ··· 66 68 67 69 writew(0, io_base + OMAP_MPUIO_IO_CNTL); 68 70 writew(byte, this->IO_ADDR_W); 69 - ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, 0); 71 + gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NWE, 0); 70 72 ndelay(40); 71 - ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, 72 - AMS_DELTA_LATCH2_NAND_NWE); 73 + gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NWE, 1); 73 74 } 74 75 75 76 static u_char ams_delta_read_byte(struct mtd_info *mtd) ··· 77 80 struct nand_chip *this = mtd->priv; 78 81 void __iomem *io_base = this->priv; 79 82 80 - ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, 0); 83 + gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NRE, 0); 81 84 ndelay(40); 82 85 writew(~0, io_base + OMAP_MPUIO_IO_CNTL); 83 86 res = readw(this->IO_ADDR_R); 84 - ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, 85 - AMS_DELTA_LATCH2_NAND_NRE); 87 + gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NRE, 1); 86 88 87 89 return res; 88 90 } ··· 128 132 { 129 133 130 134 if (ctrl & NAND_CTRL_CHANGE) { 131 - unsigned long bits; 132 - 133 - bits = (~ctrl & NAND_NCE) ? AMS_DELTA_LATCH2_NAND_NCE : 0; 134 - bits |= (ctrl & NAND_CLE) ? AMS_DELTA_LATCH2_NAND_CLE : 0; 135 - bits |= (ctrl & NAND_ALE) ? AMS_DELTA_LATCH2_NAND_ALE : 0; 136 - 137 - ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_CLE | 138 - AMS_DELTA_LATCH2_NAND_ALE | 139 - AMS_DELTA_LATCH2_NAND_NCE, bits); 135 + gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NCE, 136 + (ctrl & NAND_NCE) == 0); 137 + gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_CLE, 138 + (ctrl & NAND_CLE) != 0); 139 + gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_ALE, 140 + (ctrl & NAND_ALE) != 0); 140 141 } 141 142 142 143 if (cmd != NAND_CMD_NONE) ··· 144 151 { 145 152 return gpio_get_value(AMS_DELTA_GPIO_PIN_NAND_RB); 146 153 } 154 + 155 + static const struct gpio _mandatory_gpio[] = { 156 + { 157 + .gpio = AMS_DELTA_GPIO_PIN_NAND_NCE, 158 + .flags = GPIOF_OUT_INIT_HIGH, 159 + .label = "nand_nce", 160 + }, 161 + { 162 + .gpio = AMS_DELTA_GPIO_PIN_NAND_NRE, 163 + .flags = GPIOF_OUT_INIT_HIGH, 164 + .label = "nand_nre", 165 + }, 166 + { 167 + .gpio = AMS_DELTA_GPIO_PIN_NAND_NWP, 168 + .flags = GPIOF_OUT_INIT_HIGH, 169 + .label = "nand_nwp", 170 + }, 171 + { 172 + .gpio = AMS_DELTA_GPIO_PIN_NAND_NWE, 173 + .flags = GPIOF_OUT_INIT_HIGH, 174 + .label = "nand_nwe", 175 + }, 176 + { 177 + .gpio = AMS_DELTA_GPIO_PIN_NAND_ALE, 178 + .flags = GPIOF_OUT_INIT_LOW, 179 + .label = "nand_ale", 180 + }, 181 + { 182 + .gpio = AMS_DELTA_GPIO_PIN_NAND_CLE, 183 + .flags = GPIOF_OUT_INIT_LOW, 184 + .label = "nand_cle", 185 + }, 186 + }; 147 187 148 188 /* 149 189 * Main initialization routine ··· 249 223 platform_set_drvdata(pdev, io_base); 250 224 251 225 /* Set chip enabled, but */ 252 - ams_delta_latch2_write(NAND_MASK, AMS_DELTA_LATCH2_NAND_NRE | 253 - AMS_DELTA_LATCH2_NAND_NWE | 254 - AMS_DELTA_LATCH2_NAND_NCE | 255 - AMS_DELTA_LATCH2_NAND_NWP); 226 + err = gpio_request_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio)); 227 + if (err) 228 + goto out_gpio; 256 229 257 230 /* Scan to find existence of the device */ 258 231 if (nand_scan(ams_delta_mtd, 1)) { ··· 266 241 goto out; 267 242 268 243 out_mtd: 244 + gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio)); 245 + out_gpio: 269 246 platform_set_drvdata(pdev, NULL); 247 + gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB); 270 248 iounmap(io_base); 271 249 out_release_io: 272 250 release_mem_region(res->start, resource_size(res)); ··· 290 262 /* Release resources, unregister device */ 291 263 nand_release(ams_delta_mtd); 292 264 265 + gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio)); 266 + gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB); 293 267 iounmap(io_base); 294 268 release_mem_region(res->start, resource_size(res)); 295 269
+20 -7
drivers/video/omap/lcd_ams_delta.c
··· 25 25 #include <linux/io.h> 26 26 #include <linux/delay.h> 27 27 #include <linux/lcd.h> 28 + #include <linux/gpio.h> 28 29 29 30 #include <plat/board-ams-delta.h> 30 31 #include <mach/hardware.h> ··· 99 98 100 99 /* omapfb panel section */ 101 100 101 + static const struct gpio _gpios[] = { 102 + { 103 + .gpio = AMS_DELTA_GPIO_PIN_LCD_VBLEN, 104 + .flags = GPIOF_OUT_INIT_LOW, 105 + .label = "lcd_vblen", 106 + }, 107 + { 108 + .gpio = AMS_DELTA_GPIO_PIN_LCD_NDISP, 109 + .flags = GPIOF_OUT_INIT_LOW, 110 + .label = "lcd_ndisp", 111 + }, 112 + }; 113 + 102 114 static int ams_delta_panel_init(struct lcd_panel *panel, 103 115 struct omapfb_device *fbdev) 104 116 { 105 - return 0; 117 + return gpio_request_array(_gpios, ARRAY_SIZE(_gpios)); 106 118 } 107 119 108 120 static void ams_delta_panel_cleanup(struct lcd_panel *panel) 109 121 { 122 + gpio_free_array(_gpios, ARRAY_SIZE(_gpios)); 110 123 } 111 124 112 125 static int ams_delta_panel_enable(struct lcd_panel *panel) 113 126 { 114 - ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_NDISP, 115 - AMS_DELTA_LATCH2_LCD_NDISP); 116 - ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN, 117 - AMS_DELTA_LATCH2_LCD_VBLEN); 127 + gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_NDISP, 1); 128 + gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_VBLEN, 1); 118 129 return 0; 119 130 } 120 131 121 132 static void ams_delta_panel_disable(struct lcd_panel *panel) 122 133 { 123 - ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN, 0); 124 - ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_NDISP, 0); 134 + gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_VBLEN, 0); 135 + gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_NDISP, 0); 125 136 } 126 137 127 138 static unsigned long ams_delta_panel_get_caps(struct lcd_panel *panel)
+1 -33
sound/soc/omap/ams-delta.c
··· 426 426 }; 427 427 428 428 429 - /* Board specific codec bias level control */ 430 - static int ams_delta_set_bias_level(struct snd_soc_card *card, 431 - struct snd_soc_dapm_context *dapm, 432 - enum snd_soc_bias_level level) 433 - { 434 - switch (level) { 435 - case SND_SOC_BIAS_ON: 436 - case SND_SOC_BIAS_PREPARE: 437 - case SND_SOC_BIAS_STANDBY: 438 - if (card->dapm.bias_level == SND_SOC_BIAS_OFF) 439 - ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_NRESET, 440 - AMS_DELTA_LATCH2_MODEM_NRESET); 441 - break; 442 - case SND_SOC_BIAS_OFF: 443 - if (card->dapm.bias_level != SND_SOC_BIAS_OFF) 444 - ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_NRESET, 445 - 0); 446 - } 447 - card->dapm.bias_level = level; 448 - 449 - return 0; 450 - } 451 - 452 429 /* Digital mute implemented using modem/CPU multiplexer. 453 430 * Shares hardware with codec config pulse generation */ 454 431 static bool ams_delta_muted = 1; ··· 488 511 ams_delta_ops.startup = ams_delta_startup; 489 512 ams_delta_ops.shutdown = ams_delta_shutdown; 490 513 } 491 - 492 - /* Set codec bias level */ 493 - ams_delta_set_bias_level(card, dapm, SND_SOC_BIAS_STANDBY); 494 514 495 515 /* Add hook switch - can be used to control the codec from userspace 496 516 * even if line discipline fails */ ··· 572 598 .owner = THIS_MODULE, 573 599 .dai_link = &ams_delta_dai_link, 574 600 .num_links = 1, 575 - .set_bias_level = ams_delta_set_bias_level, 576 601 }; 577 602 578 603 /* Module init/exit */ ··· 608 635 platform_device_put(ams_delta_audio_platform_device); 609 636 return ret; 610 637 } 611 - module_init(ams_delta_module_init); 638 + late_initcall(ams_delta_module_init); 612 639 613 640 static void __exit ams_delta_module_exit(void) 614 641 { ··· 619 646 snd_soc_jack_free_gpios(&ams_delta_hook_switch, 620 647 ARRAY_SIZE(ams_delta_hook_switch_gpios), 621 648 ams_delta_hook_switch_gpios); 622 - 623 - /* Keep modem power on */ 624 - ams_delta_set_bias_level(&ams_delta_audio_card, 625 - &ams_delta_audio_card.rtd[0].codec->dapm, 626 - SND_SOC_BIAS_STANDBY); 627 649 628 650 platform_device_unregister(cx20442_platform_device); 629 651 platform_device_unregister(ams_delta_audio_platform_device);