blob: 6ad3cefe4829e7cbbf94dc8f7d4b400f72537b02 [file] [log] [blame]
Rohit Vaswanie897f842012-03-19 14:19:34 -07001/* Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13#include <linux/kernel.h>
14#include <linux/irq.h>
15#include <linux/gpio.h>
16#include <linux/platform_device.h>
17#include <linux/delay.h>
18#include <linux/io.h>
Anirudh Ghayal9d9cdc22011-10-10 17:17:07 +053019#include <linux/msm_ssbi.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070020#include <linux/mfd/pmic8058.h>
21#include <linux/regulator/pmic8058-regulator.h>
22#include <linux/i2c.h>
23#include <linux/dma-mapping.h>
24#include <linux/dmapool.h>
25#include <linux/regulator/pm8058-xo.h>
26
27#include <asm/mach-types.h>
28#include <asm/mach/arch.h>
29#include <asm/setup.h>
30
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070031#include <mach/board.h>
32#include <mach/memory.h>
33#include <mach/msm_iomap.h>
34#include <mach/dma.h>
35#include <mach/sirc.h>
Jeff Ohlsteindd0dd9b2012-05-29 17:47:21 -070036#include <mach/restart.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070037
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070038#include <mach/socinfo.h>
39#include "devices.h"
40#include "timer.h"
Matt Wagantall6d9ebee2011-08-26 12:15:24 -070041#include "acpuclock.h"
Matt Wagantall7cca4642012-02-01 16:43:24 -080042#include "pm.h"
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070043#include "spm.h"
44#include <linux/regulator/consumer.h>
45#include <linux/regulator/machine.h>
46#include <linux/msm_adc.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070047#include <linux/m_adcproc.h>
48#include <linux/platform_data/qcom_crypto_device.h>
49
50#define PMIC_GPIO_INT 144
51#define PMIC_VREG_WLAN_LEVEL 2900
52#define PMIC_GPIO_SD_DET 165
53
54#define GPIO_EPHY_RST_N 37
Rohit Vaswani73299b42011-12-16 13:38:02 -080055#define GPIO_MAC_TXD_3 119
56#define GPIO_MAC_TXD_2 120
57#define GPIO_MAC_TXD_1 121
58#define GPIO_MAC_TXD_0 122
59#define GPIO_MAC_TX_EN 123
60#define GPIO_MAC_MDIO 127
61#define GPIO_MAC_MDC 128
62#define GPIO_MAC_TX_CLK 133
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070063#define GPIO_GRFC_FTR0_0 136 /* GRFC 20 */
64#define GPIO_GRFC_FTR0_1 137 /* GRFC 21 */
65#define GPIO_GRFC_FTR1_0 145 /* GRFC 22 */
66#define GPIO_GRFC_FTR1_1 93 /* GRFC 19 */
67#define GPIO_GRFC_2 110
68#define GPIO_GRFC_3 109
69#define GPIO_GRFC_4 108
70#define GPIO_GRFC_5 107
71#define GPIO_GRFC_6 106
72#define GPIO_GRFC_7 105
73#define GPIO_GRFC_8 104
74#define GPIO_GRFC_9 103
75#define GPIO_GRFC_10 102
76#define GPIO_GRFC_11 101
77#define GPIO_GRFC_13 99
78#define GPIO_GRFC_14 98
79#define GPIO_GRFC_15 97
80#define GPIO_GRFC_16 96
81#define GPIO_GRFC_17 95
82#define GPIO_GRFC_18 94
83#define GPIO_GRFC_24 150
84#define GPIO_GRFC_25 151
85#define GPIO_GRFC_26 152
86#define GPIO_GRFC_27 153
87#define GPIO_GRFC_28 154
88#define GPIO_GRFC_29 155
89
Rohit Vaswani26512de2011-07-11 16:01:13 -070090#define GPIO_USER_FIRST 58
91#define GPIO_USER_LAST 63
92
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070093#define FPGA_SDCC_STATUS 0x8E0001A8
94
95/* Macros assume PMIC GPIOs start at 0 */
Anirudh Ghayalc2019332011-11-12 06:29:10 +053096#define PM8058_GPIO_PM_TO_SYS(pm_gpio) (pm_gpio + NR_MSM_GPIOS)
97#define PM8058_GPIO_SYS_TO_PM(sys_gpio) (sys_gpio - NR_MSM_GPIOS)
98#define PM8058_MPP_BASE (NR_MSM_GPIOS + PM8058_GPIOS)
99#define PM8058_MPP_PM_TO_SYS(pm_gpio) (pm_gpio + PM8058_MPP_BASE)
100#define PM8058_MPP_SYS_TO_PM(sys_gpio) (sys_gpio - PM8058_MPP_BASE)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700101
102#define PMIC_GPIO_5V_PA_PWR 21 /* PMIC GPIO Number 22 */
103#define PMIC_GPIO_4_2V_PA_PWR 22 /* PMIC GPIO Number 23 */
104#define PMIC_MPP_3 2 /* PMIC MPP Number 3 */
105#define PMIC_MPP_6 5 /* PMIC MPP Number 6 */
106#define PMIC_MPP_7 6 /* PMIC MPP Number 7 */
107#define PMIC_MPP_10 9 /* PMIC MPP Number 10 */
108
109/*
110 * PM8058
111 */
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530112struct pm8xxx_mpp_init_info {
113 unsigned mpp;
114 struct pm8xxx_mpp_config_data config;
115};
116
117#define PM8XXX_MPP_INIT(_mpp, _type, _level, _control) \
118{ \
119 .mpp = PM8058_MPP_PM_TO_SYS(_mpp), \
120 .config = { \
121 .type = PM8XXX_MPP_TYPE_##_type, \
122 .level = _level, \
123 .control = PM8XXX_MPP_##_control, \
124 } \
125}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700126
127static int pm8058_gpios_init(void)
128{
129 int i;
130 int rc;
131 struct pm8058_gpio_cfg {
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530132 int gpio;
133 struct pm_gpio cfg;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700134 };
135
136 struct pm8058_gpio_cfg gpio_cfgs[] = {
137 { /* 5V PA Power */
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530138 PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_5V_PA_PWR),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700139 {
140 .vin_sel = 0,
141 .direction = PM_GPIO_DIR_BOTH,
142 .output_value = 1,
143 .output_buffer = PM_GPIO_OUT_BUF_CMOS,
144 .pull = PM_GPIO_PULL_DN,
145 .out_strength = PM_GPIO_STRENGTH_HIGH,
146 .function = PM_GPIO_FUNC_NORMAL,
147 .inv_int_pol = 0,
148 },
149 },
150 { /* 4.2V PA Power */
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530151 PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_4_2V_PA_PWR),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700152 {
153 .vin_sel = 0,
154 .direction = PM_GPIO_DIR_BOTH,
155 .output_value = 1,
156 .output_buffer = PM_GPIO_OUT_BUF_CMOS,
157 .pull = PM_GPIO_PULL_DN,
158 .out_strength = PM_GPIO_STRENGTH_HIGH,
159 .function = PM_GPIO_FUNC_NORMAL,
160 .inv_int_pol = 0,
161 },
162 },
163 };
164
165 for (i = 0; i < ARRAY_SIZE(gpio_cfgs); ++i) {
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530166 rc = pm8xxx_gpio_config(gpio_cfgs[i].gpio, &gpio_cfgs[i].cfg);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700167 if (rc < 0) {
168 pr_err("%s pmic gpio config failed\n", __func__);
169 return rc;
170 }
171 }
172
173 return 0;
174}
175
176static int pm8058_mpps_init(void)
177{
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530178 int rc, i;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700179
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530180 struct pm8xxx_mpp_init_info pm8058_mpps[] = {
181 PM8XXX_MPP_INIT(PMIC_MPP_3, A_OUTPUT,
182 PM8XXX_MPP_AOUT_LVL_1V25_2, AOUT_CTRL_ENABLE),
183 PM8XXX_MPP_INIT(PMIC_MPP_6, A_OUTPUT,
184 PM8XXX_MPP_AOUT_LVL_1V25_2, AOUT_CTRL_ENABLE),
185 };
186
187 for (i = 0; i < ARRAY_SIZE(pm8058_mpps); i++) {
188 rc = pm8xxx_mpp_config(pm8058_mpps[i].mpp,
189 &pm8058_mpps[i].config);
190 if (rc) {
191 pr_err("%s: Config %d mpp pm 8058 failed\n",
192 __func__, pm8058_mpps[i].mpp);
193 return rc;
194 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700195 }
196
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700197 return 0;
198}
199
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700200static struct regulator_consumer_supply pm8058_vreg_supply[PM8058_VREG_MAX] = {
201 [PM8058_VREG_ID_L3] = REGULATOR_SUPPLY("8058_l3", NULL),
202 [PM8058_VREG_ID_L8] = REGULATOR_SUPPLY("8058_l8", NULL),
203 [PM8058_VREG_ID_L9] = REGULATOR_SUPPLY("8058_l9", NULL),
204 [PM8058_VREG_ID_L14] = REGULATOR_SUPPLY("8058_l14", NULL),
205 [PM8058_VREG_ID_L15] = REGULATOR_SUPPLY("8058_l15", NULL),
206 [PM8058_VREG_ID_L18] = REGULATOR_SUPPLY("8058_l18", NULL),
207 [PM8058_VREG_ID_S4] = REGULATOR_SUPPLY("8058_s4", NULL),
208
209 [PM8058_VREG_ID_LVS0] = REGULATOR_SUPPLY("8058_lvs0", NULL),
210};
211
212#define PM8058_VREG_INIT(_id, _min_uV, _max_uV, _modes, _ops, _apply_uV, \
213 _always_on, _pull_down) \
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530214 { \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700215 .init_data = { \
216 .constraints = { \
217 .valid_modes_mask = _modes, \
218 .valid_ops_mask = _ops, \
219 .min_uV = _min_uV, \
220 .max_uV = _max_uV, \
221 .apply_uV = _apply_uV, \
222 .always_on = _always_on, \
223 }, \
224 .num_consumer_supplies = 1, \
225 .consumer_supplies = &pm8058_vreg_supply[_id], \
226 }, \
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530227 .id = _id, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700228 .pull_down_enable = _pull_down, \
229 .pin_ctrl = 0, \
230 .pin_fn = PM8058_VREG_PIN_FN_ENABLE, \
231 }
232
233#define PM8058_VREG_INIT_LDO(_id, _min_uV, _max_uV) \
234 PM8058_VREG_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL | \
235 REGULATOR_MODE_IDLE | REGULATOR_MODE_STANDBY, \
236 REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS | \
237 REGULATOR_CHANGE_MODE, 1, 1, 1)
238
239#define PM8058_VREG_INIT_SMPS(_id, _min_uV, _max_uV) \
240 PM8058_VREG_INIT(_id, _min_uV, _max_uV, REGULATOR_MODE_NORMAL | \
241 REGULATOR_MODE_IDLE | REGULATOR_MODE_STANDBY, \
242 REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS | \
243 REGULATOR_CHANGE_MODE, 1, 1, 1)
244
245#define PM8058_VREG_INIT_LVS(_id, _min_uV, _max_uV) \
246 PM8058_VREG_INIT(_id, _min_uV, _min_uV, REGULATOR_MODE_NORMAL, \
247 REGULATOR_CHANGE_STATUS, 0, 0, 1)
248
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530249static struct pm8058_vreg_pdata pm8058_vreg_init[] = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700250 PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L3, 1800000, 1800000),
251 PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L8, 2200000, 2200000),
252 PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L9, 2050000, 2050000),
253 PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L14, 2850000, 2850000),
254 PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L15, 2200000, 2200000),
255 PM8058_VREG_INIT_LDO(PM8058_VREG_ID_L18, 2200000, 2200000),
256 PM8058_VREG_INIT_LVS(PM8058_VREG_ID_LVS0, 1800000, 1800000),
257 PM8058_VREG_INIT_SMPS(PM8058_VREG_ID_S4, 1300000, 1300000),
258};
259
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700260#ifdef CONFIG_SENSORS_MSM_ADC
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700261static struct adc_access_fn xoadc_fn = {
262 pm8058_xoadc_select_chan_and_start_conv,
263 pm8058_xoadc_read_adc_code,
264 pm8058_xoadc_get_properties,
265 pm8058_xoadc_slot_request,
266 pm8058_xoadc_restore_slot,
267 pm8058_xoadc_calibrate,
268};
269
270static struct msm_adc_channels msm_adc_channels_data[] = {
271 {"pmic_therm", CHANNEL_ADC_DIE_TEMP, 0, &xoadc_fn, CHAN_PATH_TYPE12,
272 ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE1, scale_pmic_therm},
273 {"ref_1250mv", CHANNEL_ADC_1250_REF, 0, &xoadc_fn, CHAN_PATH_TYPE13,
274 ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE2, scale_default},
275 {"xo_therm", CHANNEL_ADC_XOTHERM, 0, &xoadc_fn, CHAN_PATH_TYPE_NONE,
276 ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE5, tdkntcgtherm},
277 {"fsm_therm", CHANNEL_ADC_FSM_THERM, 0, &xoadc_fn, CHAN_PATH_TYPE6,
278 ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE5, tdkntcgtherm},
279 {"pa_therm", CHANNEL_ADC_PA_THERM, 0, &xoadc_fn, CHAN_PATH_TYPE7,
280 ADC_CONFIG_TYPE2, ADC_CALIB_CONFIG_TYPE5, tdkntcgtherm},
281};
282
283static struct msm_adc_platform_data msm_adc_pdata = {
284 .channel = msm_adc_channels_data,
285 .num_chan_supported = ARRAY_SIZE(msm_adc_channels_data),
286 .target_hw = FSM_9xxx,
287};
288
289static struct platform_device msm_adc_device = {
290 .name = "msm_adc",
291 .id = -1,
292 .dev = {
293 .platform_data = &msm_adc_pdata,
294 },
295};
296
297static void pmic8058_xoadc_mpp_config(void)
298{
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530299 int rc, i;
300 struct pm8xxx_mpp_init_info xoadc_mpps[] = {
301 PM8XXX_MPP_INIT(PMIC_MPP_7, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH5,
302 AOUT_CTRL_DISABLE),
303 PM8XXX_MPP_INIT(PMIC_MPP_10, A_INPUT, PM8XXX_MPP_AIN_AMUX_CH6,
304 AOUT_CTRL_DISABLE),
305 };
306 for (i = 0; i < ARRAY_SIZE(xoadc_mpps); i++) {
307 rc = pm8xxx_mpp_config(xoadc_mpps[i].mpp,
308 &xoadc_mpps[i].config);
309 if (rc) {
310 pr_err("%s: Config MPP %d of PM8058 failed\n",
311 __func__, xoadc_mpps[i].mpp);
312 }
313 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700314}
315
316static struct regulator *vreg_ldo18_adc;
317
318static int pmic8058_xoadc_vreg_config(int on)
319{
320 int rc;
321
322 if (on) {
323 rc = regulator_enable(vreg_ldo18_adc);
324 if (rc)
325 pr_err("%s: Enable of regulator ldo18_adc "
326 "failed\n", __func__);
327 } else {
328 rc = regulator_disable(vreg_ldo18_adc);
329 if (rc)
330 pr_err("%s: Disable of regulator ldo18_adc "
331 "failed\n", __func__);
332 }
333
334 return rc;
335}
336
337static int pmic8058_xoadc_vreg_setup(void)
338{
339 int rc;
340
341 vreg_ldo18_adc = regulator_get(NULL, "8058_l18");
342 if (IS_ERR(vreg_ldo18_adc)) {
343 pr_err("%s: vreg get failed (%ld)\n",
344 __func__, PTR_ERR(vreg_ldo18_adc));
345 rc = PTR_ERR(vreg_ldo18_adc);
346 goto fail;
347 }
348
349 rc = regulator_set_voltage(vreg_ldo18_adc, 2200000, 2200000);
350 if (rc) {
351 pr_err("%s: unable to set ldo18 voltage to 2.2V\n", __func__);
352 goto fail;
353 }
354
355 return rc;
356fail:
357 regulator_put(vreg_ldo18_adc);
358 return rc;
359}
360
361static void pmic8058_xoadc_vreg_shutdown(void)
362{
363 regulator_put(vreg_ldo18_adc);
364}
365
366/* usec. For this ADC,
367 * this time represents clk rate @ txco w/ 1024 decimation ratio.
368 * Each channel has different configuration, thus at the time of starting
369 * the conversion, xoadc will return actual conversion time
370 * */
371static struct adc_properties pm8058_xoadc_data = {
372 .adc_reference = 2200, /* milli-voltage for this adc */
373 .bitresolution = 15,
374 .bipolar = 0,
375 .conversiontime = 54,
376};
377
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530378static struct xoadc_platform_data pm8058_xoadc_pdata = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700379 .xoadc_prop = &pm8058_xoadc_data,
380 .xoadc_mpp_config = pmic8058_xoadc_mpp_config,
381 .xoadc_vreg_set = pmic8058_xoadc_vreg_config,
382 .xoadc_num = XOADC_PMIC_0,
383 .xoadc_vreg_setup = pmic8058_xoadc_vreg_setup,
384 .xoadc_vreg_shutdown = pmic8058_xoadc_vreg_shutdown,
385};
386#endif
387
Rohit Vaswani4c0d3042011-07-13 14:19:23 -0700388#define XO_CONSUMERS(_id) \
389 static struct regulator_consumer_supply xo_consumers_##_id[]
390
391/*
392 * Consumer specific regulator names:
393 * regulator name consumer dev_name
394 */
395XO_CONSUMERS(A0) = {
396 REGULATOR_SUPPLY("8058_xo_a0", NULL),
397 REGULATOR_SUPPLY("a0_clk_buffer", "fsm_xo_driver"),
398};
399XO_CONSUMERS(A1) = {
400 REGULATOR_SUPPLY("8058_xo_a1", NULL),
401 REGULATOR_SUPPLY("a1_clk_buffer", "fsm_xo_driver"),
402};
403
404#define PM8058_XO_INIT(_id, _modes, _ops, _always_on) \
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530405 { \
Rohit Vaswani4c0d3042011-07-13 14:19:23 -0700406 .init_data = { \
407 .constraints = { \
408 .valid_modes_mask = _modes, \
409 .valid_ops_mask = _ops, \
Rohit Vaswani7beff902011-08-15 13:42:31 -0700410 .boot_on = 1, \
Rohit Vaswani4c0d3042011-07-13 14:19:23 -0700411 .always_on = _always_on, \
412 }, \
413 .num_consumer_supplies = \
414 ARRAY_SIZE(xo_consumers_##_id),\
415 .consumer_supplies = xo_consumers_##_id, \
416 }, \
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530417 .id = PM8058_XO_ID_##_id, \
Rohit Vaswani4c0d3042011-07-13 14:19:23 -0700418 }
419
420#define PM8058_XO_INIT_AX(_id) \
421 PM8058_XO_INIT(_id, REGULATOR_MODE_NORMAL, REGULATOR_CHANGE_STATUS, 0)
422
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530423static struct pm8058_xo_pdata pm8058_xo_init_pdata[] = {
Rohit Vaswani4c0d3042011-07-13 14:19:23 -0700424 PM8058_XO_INIT_AX(A0),
425 PM8058_XO_INIT_AX(A1),
426};
427
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530428#define PM8058_GPIO_INT 47
Rohit Vaswani4c0d3042011-07-13 14:19:23 -0700429
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530430static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata = {
431 .irq_base = PMIC8058_IRQ_BASE,
432 .devirq = MSM_GPIO_TO_INT(PM8058_GPIO_INT),
433 .irq_trigger_flag = IRQF_TRIGGER_LOW,
434};
435
436static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata = {
437 .gpio_base = PM8058_GPIO_PM_TO_SYS(0),
438};
439
440static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata = {
441 .mpp_base = PM8058_MPP_PM_TO_SYS(0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700442};
443
444static struct pm8058_platform_data pm8058_fsm9xxx_data = {
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530445 .irq_pdata = &pm8xxx_irq_pdata,
446 .gpio_pdata = &pm8xxx_gpio_pdata,
447 .mpp_pdata = &pm8xxx_mpp_pdata,
448 .regulator_pdatas = pm8058_vreg_init,
449 .num_regulators = ARRAY_SIZE(pm8058_vreg_init),
450 .xo_buffer_pdata = pm8058_xo_init_pdata,
451 .num_xo_buffers = ARRAY_SIZE(pm8058_xo_init_pdata),
452#ifdef CONFIG_SENSORS_MSM_ADC
453 .xoadc_pdata = &pm8058_xoadc_pdata,
454#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700455};
456
Anirudh Ghayal9d9cdc22011-10-10 17:17:07 +0530457#ifdef CONFIG_MSM_SSBI
458static struct msm_ssbi_platform_data fsm9xxx_ssbi_pm8058_pdata = {
459 .controller_type = FSM_SBI_CTRL_SSBI,
460 .slave = {
461 .name = "pm8058-core",
462 .platform_data = &pm8058_fsm9xxx_data,
463 },
464};
465#endif
466
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700467static int __init buses_init(void)
468{
469 if (gpio_tlmm_config(GPIO_CFG(PMIC_GPIO_INT, 5, GPIO_CFG_INPUT,
470 GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE))
471 pr_err("%s: gpio_tlmm_config (gpio=%d) failed\n",
472 __func__, PMIC_GPIO_INT);
473
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700474 return 0;
475}
476
477/*
478 * EPHY
479 */
480
481static struct msm_gpio phy_config_data[] = {
482 { GPIO_CFG(GPIO_EPHY_RST_N, 0, GPIO_CFG_OUTPUT,
Rohit Vaswani73299b42011-12-16 13:38:02 -0800483 GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_RST_N" },
484 { GPIO_CFG(GPIO_MAC_TXD_3, 0, GPIO_CFG_OUTPUT,
485 GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_TXD_3"},
486 { GPIO_CFG(GPIO_MAC_TXD_2, 0, GPIO_CFG_OUTPUT,
487 GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_TXD_2"},
488 { GPIO_CFG(GPIO_MAC_TXD_1, 0, GPIO_CFG_OUTPUT,
489 GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_TXD_1"},
490 { GPIO_CFG(GPIO_MAC_TXD_0, 0, GPIO_CFG_OUTPUT,
491 GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_TXD_0"},
492 { GPIO_CFG(GPIO_MAC_TX_EN, 0, GPIO_CFG_OUTPUT,
493 GPIO_CFG_NO_PULL, GPIO_CFG_8MA), "MAC_TX_EN"},
494 { GPIO_CFG(GPIO_MAC_TX_CLK, 0, GPIO_CFG_OUTPUT,
495 GPIO_CFG_NO_PULL, GPIO_CFG_10MA), "MAC_TX_CLK"},
496 { GPIO_CFG(GPIO_MAC_MDIO, 0, GPIO_CFG_OUTPUT,
497 GPIO_CFG_NO_PULL, GPIO_CFG_6MA), "MDIO_MAC_MDIO"},
498 { GPIO_CFG(GPIO_MAC_MDC, 0, GPIO_CFG_OUTPUT,
499 GPIO_CFG_NO_PULL, GPIO_CFG_6MA), "MDC_MAC_MDC"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700500};
501
502static int __init phy_init(void)
503{
504 msm_gpios_request_enable(phy_config_data, ARRAY_SIZE(phy_config_data));
505 gpio_direction_output(GPIO_EPHY_RST_N, 0);
506 udelay(100);
507 gpio_set_value(GPIO_EPHY_RST_N, 1);
508
509 return 0;
510}
511
512/*
513 * RF
514 */
515
516static struct msm_gpio grfc_config_data[] = {
517 { GPIO_CFG(GPIO_GRFC_FTR0_0, 7, GPIO_CFG_OUTPUT,
518 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "HH_RFMODE1_0" },
519 { GPIO_CFG(GPIO_GRFC_FTR0_1, 7, GPIO_CFG_OUTPUT,
520 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "HH_RFMODE1_1" },
521 { GPIO_CFG(GPIO_GRFC_FTR1_0, 7, GPIO_CFG_OUTPUT,
522 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "HH_RFMODE2_0" },
523 { GPIO_CFG(GPIO_GRFC_FTR1_1, 7, GPIO_CFG_OUTPUT,
524 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "HH_RFMODE2_1" },
525 { GPIO_CFG(GPIO_GRFC_2, 7, GPIO_CFG_OUTPUT,
526 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_2" },
527 { GPIO_CFG(GPIO_GRFC_3, 7, GPIO_CFG_OUTPUT,
528 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_3" },
529 { GPIO_CFG(GPIO_GRFC_4, 7, GPIO_CFG_OUTPUT,
530 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_4" },
531 { GPIO_CFG(GPIO_GRFC_5, 7, GPIO_CFG_OUTPUT,
532 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_5" },
533 { GPIO_CFG(GPIO_GRFC_6, 7, GPIO_CFG_OUTPUT,
534 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_6" },
535 { GPIO_CFG(GPIO_GRFC_7, 7, GPIO_CFG_OUTPUT,
536 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_7" },
537 { GPIO_CFG(GPIO_GRFC_8, 7, GPIO_CFG_OUTPUT,
538 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_8" },
539 { GPIO_CFG(GPIO_GRFC_9, 7, GPIO_CFG_OUTPUT,
540 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_9" },
541 { GPIO_CFG(GPIO_GRFC_10, 7, GPIO_CFG_OUTPUT,
542 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_10" },
543 { GPIO_CFG(GPIO_GRFC_11, 7, GPIO_CFG_OUTPUT,
544 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_11" },
545 { GPIO_CFG(GPIO_GRFC_13, 7, GPIO_CFG_OUTPUT,
546 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_13" },
547 { GPIO_CFG(GPIO_GRFC_14, 7, GPIO_CFG_OUTPUT,
548 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_14" },
549 { GPIO_CFG(GPIO_GRFC_15, 7, GPIO_CFG_OUTPUT,
550 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_15" },
551 { GPIO_CFG(GPIO_GRFC_16, 7, GPIO_CFG_OUTPUT,
552 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_16" },
553 { GPIO_CFG(GPIO_GRFC_17, 7, GPIO_CFG_OUTPUT,
554 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_17" },
555 { GPIO_CFG(GPIO_GRFC_18, 7, GPIO_CFG_OUTPUT,
556 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_18" },
557 { GPIO_CFG(GPIO_GRFC_24, 7, GPIO_CFG_OUTPUT,
558 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_24" },
559 { GPIO_CFG(GPIO_GRFC_25, 7, GPIO_CFG_OUTPUT,
560 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_25" },
561 { GPIO_CFG(GPIO_GRFC_26, 7, GPIO_CFG_OUTPUT,
562 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_26" },
563 { GPIO_CFG(GPIO_GRFC_27, 7, GPIO_CFG_OUTPUT,
564 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_27" },
565 { GPIO_CFG(GPIO_GRFC_28, 7, GPIO_CFG_OUTPUT,
566 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_28" },
567 { GPIO_CFG(GPIO_GRFC_29, 7, GPIO_CFG_OUTPUT,
568 GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA), "GPIO_GRFC_29" },
569 { GPIO_CFG(39, 1, GPIO_CFG_OUTPUT,
570 GPIO_CFG_NO_PULL, GPIO_CFG_2MA), "PP2S_EXT_SYNC" },
571};
572
573static int __init grfc_init(void)
574{
575 msm_gpios_request_enable(grfc_config_data,
576 ARRAY_SIZE(grfc_config_data));
577
578 return 0;
579}
580
581/*
582 * UART
583 */
584
585#ifdef CONFIG_SERIAL_MSM_CONSOLE
586static struct msm_gpio uart1_config_data[] = {
587 { GPIO_CFG(138, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
588 "UART1_Rx" },
589 { GPIO_CFG(139, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
590 "UART1_Tx" },
591};
592
593static void fsm9xxx_init_uart1(void)
594{
595 msm_gpios_request_enable(uart1_config_data,
596 ARRAY_SIZE(uart1_config_data));
597
598}
599#endif
600
601/*
602 * SSBI
603 */
604
605#ifdef CONFIG_I2C_SSBI
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700606static struct msm_i2c_ssbi_platform_data msm_i2c_ssbi2_pdata = {
607 .controller_type = FSM_SBI_CTRL_SSBI,
608};
609
610static struct msm_i2c_ssbi_platform_data msm_i2c_ssbi3_pdata = {
611 .controller_type = FSM_SBI_CTRL_SSBI,
612};
Anirudh Ghayal9d9cdc22011-10-10 17:17:07 +0530613#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700614
Anirudh Ghayal9d9cdc22011-10-10 17:17:07 +0530615#if defined(CONFIG_I2C_SSBI) || defined(CONFIG_MSM_SSBI)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700616/* Intialize GPIO configuration for SSBI */
617static struct msm_gpio ssbi_gpio_config_data[] = {
618 { GPIO_CFG(140, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA),
619 "SSBI_1" },
620 { GPIO_CFG(141, 1, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA),
621 "SSBI_2" },
622 { GPIO_CFG(92, 2, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_4MA),
623 "SSBI_3" },
624};
625
626static void
627fsm9xxx_init_ssbi_gpio(void)
628{
629 msm_gpios_request_enable(ssbi_gpio_config_data,
630 ARRAY_SIZE(ssbi_gpio_config_data));
631
632}
633#endif
634
635/*
Rohit Vaswani26512de2011-07-11 16:01:13 -0700636 * User GPIOs
637 */
638
639static void user_gpios_init(void)
640{
641 unsigned int gpio;
642
643 for (gpio = GPIO_USER_FIRST; gpio <= GPIO_USER_LAST; ++gpio)
644 gpio_tlmm_config(GPIO_CFG(gpio, 0, GPIO_CFG_INPUT,
645 GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE);
646}
647
648/*
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700649 * Crypto
650 */
651
652#define QCE_SIZE 0x10000
653
654#define QCE_0_BASE 0x80C00000
655#define QCE_1_BASE 0x80E00000
656#define QCE_2_BASE 0x81000000
657
658#define QCE_NO_HW_KEY_SUPPORT 0 /* No shared HW key with external */
659#define QCE_NO_SHARE_CE_RESOURCE 0 /* No CE resource shared with TZ */
660#define QCE_NO_CE_SHARED 0 /* CE not shared with TZ */
661#define QCE_NO_SHA_HMAC_SUPPORT 0 /* No SHA-HMAC by SHA operation */
662
663static struct resource qcrypto_resources[] = {
664 [0] = {
665 .start = QCE_0_BASE,
666 .end = QCE_0_BASE + QCE_SIZE - 1,
667 .flags = IORESOURCE_MEM,
668 },
669 [1] = {
670 .name = "crypto_channels",
671 .start = DMOV_CE1_IN_CHAN,
672 .end = DMOV_CE1_OUT_CHAN,
673 .flags = IORESOURCE_DMA,
674 },
675 [2] = {
676 .name = "crypto_crci_in",
677 .start = DMOV_CE1_IN_CRCI,
678 .end = DMOV_CE1_IN_CRCI,
679 .flags = IORESOURCE_DMA,
680 },
681 [3] = {
682 .name = "crypto_crci_out",
683 .start = DMOV_CE1_OUT_CRCI,
684 .end = DMOV_CE1_OUT_CRCI,
685 .flags = IORESOURCE_DMA,
686 },
687 [4] = {
688 .name = "crypto_crci_hash",
689 .start = DMOV_CE1_HASH_CRCI,
690 .end = DMOV_CE1_HASH_CRCI,
691 .flags = IORESOURCE_DMA,
692 },
693};
694
695static struct msm_ce_hw_support qcrypto_ce_hw_suppport = {
696 .ce_shared = QCE_NO_CE_SHARED,
697 .shared_ce_resource = QCE_NO_SHARE_CE_RESOURCE,
698 .hw_key_support = QCE_NO_HW_KEY_SUPPORT,
699 .sha_hmac = QCE_NO_SHA_HMAC_SUPPORT,
Ramesh Masavarapu49259682011-12-02 14:00:18 -0800700 .bus_scale_table = NULL,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700701};
702
703struct platform_device qcrypto_device = {
704 .name = "qcrypto",
705 .id = 0,
706 .num_resources = ARRAY_SIZE(qcrypto_resources),
707 .resource = qcrypto_resources,
708 .dev = {
709 .coherent_dma_mask = DMA_BIT_MASK(32),
710 .platform_data = &qcrypto_ce_hw_suppport,
711 },
712};
713
714static struct resource qcedev_resources[] = {
715 [0] = {
716 .start = QCE_0_BASE,
717 .end = QCE_0_BASE + QCE_SIZE - 1,
718 .flags = IORESOURCE_MEM,
719 },
720 [1] = {
721 .name = "crypto_channels",
722 .start = DMOV_CE1_IN_CHAN,
723 .end = DMOV_CE1_OUT_CHAN,
724 .flags = IORESOURCE_DMA,
725 },
726 [2] = {
727 .name = "crypto_crci_in",
728 .start = DMOV_CE1_IN_CRCI,
729 .end = DMOV_CE1_IN_CRCI,
730 .flags = IORESOURCE_DMA,
731 },
732 [3] = {
733 .name = "crypto_crci_out",
734 .start = DMOV_CE1_OUT_CRCI,
735 .end = DMOV_CE1_OUT_CRCI,
736 .flags = IORESOURCE_DMA,
737 },
738 [4] = {
739 .name = "crypto_crci_hash",
740 .start = DMOV_CE1_HASH_CRCI,
741 .end = DMOV_CE1_HASH_CRCI,
742 .flags = IORESOURCE_DMA,
743 },
744};
745
746static struct msm_ce_hw_support qcedev_ce_hw_suppport = {
747 .ce_shared = QCE_NO_CE_SHARED,
748 .shared_ce_resource = QCE_NO_SHARE_CE_RESOURCE,
749 .hw_key_support = QCE_NO_HW_KEY_SUPPORT,
750 .sha_hmac = QCE_NO_SHA_HMAC_SUPPORT,
Ramesh Masavarapu49259682011-12-02 14:00:18 -0800751 .bus_scale_table = NULL,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700752};
753
754static struct platform_device qcedev_device = {
755 .name = "qce",
756 .id = 0,
757 .num_resources = ARRAY_SIZE(qcedev_resources),
758 .resource = qcedev_resources,
759 .dev = {
760 .coherent_dma_mask = DMA_BIT_MASK(32),
761 .platform_data = &qcedev_ce_hw_suppport,
762 },
763};
764
765static struct resource ota_qcrypto_resources[] = {
766 [0] = {
767 .start = QCE_1_BASE,
768 .end = QCE_1_BASE + QCE_SIZE - 1,
769 .flags = IORESOURCE_MEM,
770 },
771 [1] = {
772 .name = "crypto_channels",
773 .start = DMOV_CE2_IN_CHAN,
774 .end = DMOV_CE2_OUT_CHAN,
775 .flags = IORESOURCE_DMA,
776 },
777 [2] = {
778 .name = "crypto_crci_in",
779 .start = DMOV_CE2_IN_CRCI,
780 .end = DMOV_CE2_IN_CRCI,
781 .flags = IORESOURCE_DMA,
782 },
783 [3] = {
784 .name = "crypto_crci_out",
785 .start = DMOV_CE2_OUT_CRCI,
786 .end = DMOV_CE2_OUT_CRCI,
787 .flags = IORESOURCE_DMA,
788 },
789 [4] = {
790 .name = "crypto_crci_hash",
791 .start = DMOV_CE2_HASH_CRCI,
792 .end = DMOV_CE2_HASH_CRCI,
793 .flags = IORESOURCE_DMA,
794 },
795};
796
797struct platform_device ota_qcrypto_device = {
798 .name = "qcota",
799 .id = 0,
800 .num_resources = ARRAY_SIZE(ota_qcrypto_resources),
801 .resource = ota_qcrypto_resources,
802 .dev = {
803 .coherent_dma_mask = DMA_BIT_MASK(32),
804 },
805};
806
807/*
808 * Devices
809 */
810
811static struct platform_device *devices[] __initdata = {
812 &msm_device_smd,
813 &msm_device_dmov,
814 &msm_device_nand,
Anirudh Ghayal9d9cdc22011-10-10 17:17:07 +0530815#ifdef CONFIG_MSM_SSBI
816 &msm_device_ssbi_pmic1,
817#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700818#ifdef CONFIG_I2C_SSBI
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700819 &msm_device_ssbi2,
820 &msm_device_ssbi3,
821#endif
822#ifdef CONFIG_SENSORS_MSM_ADC
823 &msm_adc_device,
824#endif
825#ifdef CONFIG_I2C_QUP
826 &msm_gsbi1_qup_i2c_device,
827#endif
828#if defined(CONFIG_SERIAL_MSM) || defined(CONFIG_MSM_SERIAL_DEBUGGER)
829 &msm_device_uart1,
830#endif
831#if defined(CONFIG_QFP_FUSE)
832 &fsm_qfp_fuse_device,
833#endif
834 &qfec_device,
835 &qcrypto_device,
836 &qcedev_device,
837 &ota_qcrypto_device,
Rohit Vaswani4c0d3042011-07-13 14:19:23 -0700838 &fsm_xo_device,
Rohit Vaswanie897f842012-03-19 14:19:34 -0700839 &fsm9xxx_device_watchdog,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700840};
841
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700842static void __init fsm9xxx_init_irq(void)
843{
844 msm_init_irq();
845 msm_init_sirc();
846}
847
848#ifdef CONFIG_MSM_SPM
849static struct msm_spm_platform_data msm_spm_data __initdata = {
850 .reg_base_addr = MSM_SAW_BASE,
851
852 .reg_init_values[MSM_SPM_REG_SAW_CFG] = 0x05,
853 .reg_init_values[MSM_SPM_REG_SAW_SPM_CTL] = 0x18,
854 .reg_init_values[MSM_SPM_REG_SAW_SPM_SLP_TMR_DLY] = 0x00006666,
855 .reg_init_values[MSM_SPM_REG_SAW_SPM_WAKE_TMR_DLY] = 0xFF000666,
856
857 .reg_init_values[MSM_SPM_REG_SAW_SPM_PMIC_CTL] = 0xE0F272,
858 .reg_init_values[MSM_SPM_REG_SAW_SLP_CLK_EN] = 0x01,
859 .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_PRECLMP_EN] = 0x03,
860 .reg_init_values[MSM_SPM_REG_SAW_SLP_HSFS_POSTCLMP_EN] = 0x00,
861
862 .reg_init_values[MSM_SPM_REG_SAW_SLP_CLMP_EN] = 0x01,
863 .reg_init_values[MSM_SPM_REG_SAW_SLP_RST_EN] = 0x00,
864 .reg_init_values[MSM_SPM_REG_SAW_SPM_MPM_CFG] = 0x00,
865
866 .awake_vlevel = 0xF2,
867 .retention_vlevel = 0xE0,
868 .collapse_vlevel = 0x72,
869 .retention_mid_vlevel = 0xE0,
870 .collapse_mid_vlevel = 0xE0,
871};
872#endif
873
874static void __init fsm9xxx_init(void)
875{
Matt Wagantallec57f062011-08-16 23:54:46 -0700876 acpuclk_init(&acpuclk_9xxx_soc_data);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700877
878 regulator_has_full_constraints();
879
Anirudh Ghayal9d9cdc22011-10-10 17:17:07 +0530880#if defined(CONFIG_I2C_SSBI) || defined(CONFIG_MSM_SSBI)
881 fsm9xxx_init_ssbi_gpio();
882#endif
883#ifdef CONFIG_MSM_SSBI
884 msm_device_ssbi_pmic1.dev.platform_data =
885 &fsm9xxx_ssbi_pm8058_pdata;
886#endif
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530887 buses_init();
Anirudh Ghayal9d9cdc22011-10-10 17:17:07 +0530888
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700889 platform_add_devices(devices, ARRAY_SIZE(devices));
890
891#ifdef CONFIG_MSM_SPM
892 msm_spm_init(&msm_spm_data, 1);
893#endif
Anirudh Ghayalc2019332011-11-12 06:29:10 +0530894 pm8058_gpios_init();
895 pm8058_mpps_init();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700896 phy_init();
897 grfc_init();
Rohit Vaswani26512de2011-07-11 16:01:13 -0700898 user_gpios_init();
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700899
900#ifdef CONFIG_SERIAL_MSM_CONSOLE
901 fsm9xxx_init_uart1();
902#endif
903#ifdef CONFIG_I2C_SSBI
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700904 msm_device_ssbi2.dev.platform_data = &msm_i2c_ssbi2_pdata;
905 msm_device_ssbi3.dev.platform_data = &msm_i2c_ssbi3_pdata;
906#endif
907}
908
909static void __init fsm9xxx_map_io(void)
910{
911 msm_shared_ram_phys = 0x00100000;
912 msm_map_fsm9xxx_io();
Stephen Boydbb600ae2011-08-02 20:11:40 -0700913 msm_clock_init(&fsm9xxx_clock_init_data);
Jeff Ohlstein3a77f9f2011-09-06 14:50:20 -0700914 if (socinfo_init() < 0)
915 pr_err("%s: socinfo_init() failed!\n",
916 __func__);
917
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700918}
919
920MACHINE_START(FSM9XXX_SURF, "QCT FSM9XXX")
Steve Mucklef132c6c2012-06-06 18:30:57 -0700921 .atag_offset = 0x100,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700922 .map_io = fsm9xxx_map_io,
923 .init_irq = fsm9xxx_init_irq,
Rohit Vaswani44747e52012-01-04 11:29:38 -0800924 .handle_irq = vic_handle_irq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700925 .init_machine = fsm9xxx_init,
926 .timer = &msm_timer,
Jeff Ohlsteindd0dd9b2012-05-29 17:47:21 -0700927 .restart = fsm_restart,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700928MACHINE_END