1/* 2 * arch/arm/mach-u300/i2c.c 3 * 4 * Copyright (C) 2009 ST-Ericsson AB 5 * License terms: GNU General Public License (GPL) version 2 6 * 7 * Register board i2c devices 8 * Author: Linus Walleij <linus.walleij@stericsson.com> 9 */ 10#include <linux/kernel.h> 11#include <linux/i2c.h> 12#include <linux/mfd/abx500.h> 13#include <linux/regulator/machine.h> 14#include <linux/amba/bus.h> 15#include <mach/irqs.h> 16 17/* 18 * Initial settings of ab3100 registers. 19 * Common for below LDO regulator settings are that 20 * bit 7-5 controls voltage. Bit 4 turns regulator ON(1) or OFF(0). 21 * Bit 3-2 controls sleep enable and bit 1-0 controls sleep mode. 22 */ 23 24/* LDO_A 0x16: 2.75V, ON, SLEEP_A, SLEEP OFF GND */ 25#define LDO_A_SETTING 0x16 26/* LDO_C 0x10: 2.65V, ON, SLEEP_A or B, SLEEP full power */ 27#define LDO_C_SETTING 0x10 28/* LDO_D 0x10: 2.65V, ON, sleep mode not used */ 29#define LDO_D_SETTING 0x10 30/* LDO_E 0x10: 1.8V, ON, SLEEP_A or B, SLEEP full power */ 31#define LDO_E_SETTING 0x10 32/* LDO_E SLEEP 0x00: 1.8V, not used, SLEEP_A or B, not used */ 33#define LDO_E_SLEEP_SETTING 0x00 34/* LDO_F 0xD0: 2.5V, ON, SLEEP_A or B, SLEEP full power */ 35#define LDO_F_SETTING 0xD0 36/* LDO_G 0x00: 2.85V, OFF, SLEEP_A or B, SLEEP full power */ 37#define LDO_G_SETTING 0x00 38/* LDO_H 0x18: 2.75V, ON, SLEEP_B, SLEEP full power */ 39#define LDO_H_SETTING 0x18 40/* LDO_K 0x00: 2.75V, OFF, SLEEP_A or B, SLEEP full power */ 41#define LDO_K_SETTING 0x00 42/* LDO_EXT 0x00: Voltage not set, OFF, not used, not used */ 43#define LDO_EXT_SETTING 0x00 44/* BUCK 0x7D: 1.2V, ON, SLEEP_A and B, SLEEP low power */ 45#define BUCK_SETTING 0x7D 46/* BUCK SLEEP 0xAC: 1.05V, Not used, SLEEP_A and B, Not used */ 47#define BUCK_SLEEP_SETTING 0xAC 48 49#ifdef CONFIG_AB3100_CORE 50static struct regulator_consumer_supply supply_ldo_c[] = { 51 { 52 .dev_name = "ab3100-codec", 53 .supply = "vaudio", /* Powers the codec */ 54 }, 55}; 56 57/* 58 * This one needs to be a supply so we can turn it off 59 * in order to shut down the system. 60 */ 61static struct regulator_consumer_supply supply_ldo_d[] = { 62 { 63 .dev = NULL, 64 .supply = "vana15", /* Powers the SoC (CPU etc) */ 65 }, 66}; 67 68static struct regulator_consumer_supply supply_ldo_g[] = { 69 { 70 .dev_name = "mmci", 71 .supply = "vmmc", /* Powers MMC/SD card */ 72 }, 73}; 74 75static struct regulator_consumer_supply supply_ldo_h[] = { 76 { 77 .dev_name = "xgam_pdi", 78 .supply = "vdisp", /* Powers camera, display etc */ 79 }, 80}; 81 82static struct regulator_consumer_supply supply_ldo_k[] = { 83 { 84 .dev_name = "irda", 85 .supply = "vir", /* Power IrDA */ 86 }, 87}; 88 89/* 90 * This is a placeholder for whoever wish to use the 91 * external power. 92 */ 93static struct regulator_consumer_supply supply_ldo_ext[] = { 94 { 95 .dev = NULL, 96 .supply = "vext", /* External power */ 97 }, 98}; 99 100/* Preset (hardware defined) voltages for these regulators */ 101#define LDO_A_VOLTAGE 2750000 102#define LDO_C_VOLTAGE 2650000 103#define LDO_D_VOLTAGE 2650000 104 105static struct ab3100_platform_data ab3100_plf_data = { 106 .reg_constraints = { 107 /* LDO A routing and constraints */ 108 { 109 .constraints = { 110 .name = "vrad", 111 .min_uV = LDO_A_VOLTAGE, 112 .max_uV = LDO_A_VOLTAGE, 113 .valid_modes_mask = REGULATOR_MODE_NORMAL, 114 .always_on = 1, 115 .boot_on = 1, 116 }, 117 }, 118 /* LDO C routing and constraints */ 119 { 120 .constraints = { 121 .min_uV = LDO_C_VOLTAGE, 122 .max_uV = LDO_C_VOLTAGE, 123 .valid_modes_mask = REGULATOR_MODE_NORMAL, 124 }, 125 .num_consumer_supplies = ARRAY_SIZE(supply_ldo_c), 126 .consumer_supplies = supply_ldo_c, 127 }, 128 /* LDO D routing and constraints */ 129 { 130 .constraints = { 131 .min_uV = LDO_D_VOLTAGE, 132 .max_uV = LDO_D_VOLTAGE, 133 .valid_modes_mask = REGULATOR_MODE_NORMAL, 134 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 135 /* 136 * Actually this is boot_on but we need 137 * to reference count it externally to 138 * be able to shut down the system. 139 */ 140 }, 141 .num_consumer_supplies = ARRAY_SIZE(supply_ldo_d), 142 .consumer_supplies = supply_ldo_d, 143 }, 144 /* LDO E routing and constraints */ 145 { 146 .constraints = { 147 .name = "vio", 148 .min_uV = 1800000, 149 .max_uV = 1800000, 150 .valid_modes_mask = REGULATOR_MODE_NORMAL, 151 .valid_ops_mask = 152 REGULATOR_CHANGE_VOLTAGE | 153 REGULATOR_CHANGE_STATUS, 154 .always_on = 1, 155 .boot_on = 1, 156 }, 157 }, 158 /* LDO F routing and constraints */ 159 { 160 .constraints = { 161 .name = "vana25", 162 .min_uV = 2500000, 163 .max_uV = 2500000, 164 .valid_modes_mask = REGULATOR_MODE_NORMAL, 165 .valid_ops_mask = 166 REGULATOR_CHANGE_VOLTAGE | 167 REGULATOR_CHANGE_STATUS, 168 .always_on = 1, 169 .boot_on = 1, 170 }, 171 }, 172 /* LDO G routing and constraints */ 173 { 174 .constraints = { 175 .min_uV = 1500000, 176 .max_uV = 2850000, 177 .valid_modes_mask = REGULATOR_MODE_NORMAL, 178 .valid_ops_mask = 179 REGULATOR_CHANGE_VOLTAGE | 180 REGULATOR_CHANGE_STATUS, 181 }, 182 .num_consumer_supplies = ARRAY_SIZE(supply_ldo_g), 183 .consumer_supplies = supply_ldo_g, 184 }, 185 /* LDO H routing and constraints */ 186 { 187 .constraints = { 188 .min_uV = 1200000, 189 .max_uV = 2750000, 190 .valid_modes_mask = REGULATOR_MODE_NORMAL, 191 .valid_ops_mask = 192 REGULATOR_CHANGE_VOLTAGE | 193 REGULATOR_CHANGE_STATUS, 194 }, 195 .num_consumer_supplies = ARRAY_SIZE(supply_ldo_h), 196 .consumer_supplies = supply_ldo_h, 197 }, 198 /* LDO K routing and constraints */ 199 { 200 .constraints = { 201 .min_uV = 1800000, 202 .max_uV = 2750000, 203 .valid_modes_mask = REGULATOR_MODE_NORMAL, 204 .valid_ops_mask = 205 REGULATOR_CHANGE_VOLTAGE | 206 REGULATOR_CHANGE_STATUS, 207 }, 208 .num_consumer_supplies = ARRAY_SIZE(supply_ldo_k), 209 .consumer_supplies = supply_ldo_k, 210 }, 211 /* External regulator interface. No fixed voltage specified. 212 * If we knew the voltage of the external regulator and it 213 * was connected on the board, we could add the (fixed) 214 * voltage for it here. 215 */ 216 { 217 .constraints = { 218 .min_uV = 0, 219 .max_uV = 0, 220 .valid_modes_mask = REGULATOR_MODE_NORMAL, 221 .valid_ops_mask = 222 REGULATOR_CHANGE_STATUS, 223 }, 224 .num_consumer_supplies = ARRAY_SIZE(supply_ldo_ext), 225 .consumer_supplies = supply_ldo_ext, 226 }, 227 /* Buck converter routing and constraints */ 228 { 229 .constraints = { 230 .name = "vcore", 231 .min_uV = 1200000, 232 .max_uV = 1800000, 233 .valid_modes_mask = REGULATOR_MODE_NORMAL, 234 .valid_ops_mask = 235 REGULATOR_CHANGE_VOLTAGE | 236 REGULATOR_CHANGE_STATUS, 237 .always_on = 1, 238 .boot_on = 1, 239 }, 240 }, 241 }, 242 .reg_initvals = { 243 LDO_A_SETTING, 244 LDO_C_SETTING, 245 LDO_E_SETTING, 246 LDO_E_SLEEP_SETTING, 247 LDO_F_SETTING, 248 LDO_G_SETTING, 249 LDO_H_SETTING, 250 LDO_K_SETTING, 251 LDO_EXT_SETTING, 252 BUCK_SETTING, 253 BUCK_SLEEP_SETTING, 254 LDO_D_SETTING, 255 }, 256}; 257#endif 258 259#ifdef CONFIG_AB3550_CORE 260static struct abx500_init_settings ab3550_init_settings[] = { 261 { 262 .bank = 0, 263 .reg = AB3550_IMR1, 264 .setting = 0xff 265 }, 266 { 267 .bank = 0, 268 .reg = AB3550_IMR2, 269 .setting = 0xff 270 }, 271 { 272 .bank = 0, 273 .reg = AB3550_IMR3, 274 .setting = 0xff 275 }, 276 { 277 .bank = 0, 278 .reg = AB3550_IMR4, 279 .setting = 0xff 280 }, 281 { 282 .bank = 0, 283 .reg = AB3550_IMR5, 284 /* The two most significant bits are not used */ 285 .setting = 0x3f 286 }, 287}; 288 289static struct ab3550_platform_data ab3550_plf_data = { 290 .irq = { 291 .base = IRQ_AB3550_BASE, 292 .count = (IRQ_AB3550_END - IRQ_AB3550_BASE + 1), 293 }, 294 .dev_data = { 295 }, 296 .init_settings = ab3550_init_settings, 297 .init_settings_sz = ARRAY_SIZE(ab3550_init_settings), 298}; 299#endif 300 301static struct i2c_board_info __initdata bus0_i2c_board_info[] = { 302#if defined(CONFIG_AB3550_CORE) 303 { 304 .type = "ab3550", 305 .addr = 0x4A, 306 .irq = IRQ_U300_IRQ0_EXT, 307 .platform_data = &ab3550_plf_data, 308 }, 309#elif defined(CONFIG_AB3100_CORE) 310 { 311 .type = "ab3100", 312 .addr = 0x48, 313 .irq = IRQ_U300_IRQ0_EXT, 314 .platform_data = &ab3100_plf_data, 315 }, 316#else 317 { }, 318#endif 319}; 320 321static struct i2c_board_info __initdata bus1_i2c_board_info[] = { 322#ifdef CONFIG_MACH_U300_BS335 323 { 324 .type = "fwcam", 325 .addr = 0x10, 326 }, 327 { 328 .type = "fwcam", 329 .addr = 0x5d, 330 }, 331#else 332 { }, 333#endif 334}; 335 336void __init u300_i2c_register_board_devices(void) 337{ 338 i2c_register_board_info(0, bus0_i2c_board_info, 339 ARRAY_SIZE(bus0_i2c_board_info)); 340 /* 341 * This makes the core shut down all unused regulators 342 * after all the initcalls have completed. 343 */ 344 regulator_has_full_constraints(); 345 i2c_register_board_info(1, bus1_i2c_board_info, 346 ARRAY_SIZE(bus1_i2c_board_info)); 347} 348