blob: 283493d685984054b677e68f689b65acd0e9a1cc [file] [log] [blame]
Stepan Moskovchenko39236d72011-11-30 17:42:23 -08001/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
2 *
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
14#include <linux/interrupt.h>
Jay Chokshi06fa7542011-12-07 13:09:17 -080015#include <linux/mfd/pm8xxx/pm8038.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080016#include <linux/mfd/pm8xxx/pm8xxx-adc.h>
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080017#include <linux/msm_ssbi.h>
18#include <asm/mach-types.h>
19#include <mach/msm_bus_board.h>
20#include <mach/restart.h>
21#include "devices.h"
Stepan Moskovchenko5a83dba2011-12-05 17:30:17 -080022#include "board-8930.h"
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080023
24struct pm8xxx_gpio_init {
25 unsigned gpio;
26 struct pm_gpio config;
27};
28
29struct pm8xxx_mpp_init {
30 unsigned mpp;
31 struct pm8xxx_mpp_config_data config;
32};
33
34#define PM8XXX_GPIO_INIT(_gpio, _dir, _buf, _val, _pull, _vin, _out_strength, \
35 _func, _inv, _disable) \
36{ \
Jay Chokshi06fa7542011-12-07 13:09:17 -080037 .gpio = PM8038_GPIO_PM_TO_SYS(_gpio), \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080038 .config = { \
39 .direction = _dir, \
40 .output_buffer = _buf, \
41 .output_value = _val, \
42 .pull = _pull, \
43 .vin_sel = _vin, \
44 .out_strength = _out_strength, \
45 .function = _func, \
46 .inv_int_pol = _inv, \
47 .disable_pin = _disable, \
48 } \
49}
50
51#define PM8XXX_MPP_INIT(_mpp, _type, _level, _control) \
52{ \
Jay Chokshi06fa7542011-12-07 13:09:17 -080053 .mpp = PM8038_MPP_PM_TO_SYS(_mpp), \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080054 .config = { \
55 .type = PM8XXX_MPP_TYPE_##_type, \
56 .level = _level, \
57 .control = PM8XXX_MPP_##_control, \
58 } \
59}
60
61#define PM8XXX_GPIO_DISABLE(_gpio) \
Jay Chokshi06fa7542011-12-07 13:09:17 -080062 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, 0, 0, 0, PM8038_GPIO_VIN_L11, \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080063 0, 0, 0, 1)
64
65#define PM8XXX_GPIO_OUTPUT(_gpio, _val) \
66 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
Jay Chokshi06fa7542011-12-07 13:09:17 -080067 PM_GPIO_PULL_NO, PM8038_GPIO_VIN_L11, \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080068 PM_GPIO_STRENGTH_HIGH, \
69 PM_GPIO_FUNC_NORMAL, 0, 0)
70
71#define PM8XXX_GPIO_INPUT(_gpio, _pull) \
72 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_IN, PM_GPIO_OUT_BUF_CMOS, 0, \
Jay Chokshi06fa7542011-12-07 13:09:17 -080073 _pull, PM8038_GPIO_VIN_L11, \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080074 PM_GPIO_STRENGTH_NO, \
75 PM_GPIO_FUNC_NORMAL, 0, 0)
76
77#define PM8XXX_GPIO_OUTPUT_FUNC(_gpio, _val, _func) \
78 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
Jay Chokshi06fa7542011-12-07 13:09:17 -080079 PM_GPIO_PULL_NO, PM8038_GPIO_VIN_L11, \
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080080 PM_GPIO_STRENGTH_HIGH, \
81 _func, 0, 0)
82
83#define PM8XXX_GPIO_OUTPUT_VIN(_gpio, _val, _vin) \
84 PM8XXX_GPIO_INIT(_gpio, PM_GPIO_DIR_OUT, PM_GPIO_OUT_BUF_CMOS, _val, \
85 PM_GPIO_PULL_NO, _vin, \
86 PM_GPIO_STRENGTH_HIGH, \
87 PM_GPIO_FUNC_NORMAL, 0, 0)
88
Jay Chokshi06fa7542011-12-07 13:09:17 -080089/* Initial pm8038 GPIO configurations */
90static struct pm8xxx_gpio_init pm8038_gpios[] __initdata = {};
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080091
Jay Chokshi06fa7542011-12-07 13:09:17 -080092/* Initial pm8038 MPP configurations */
93static struct pm8xxx_mpp_init pm8038_mpps[] __initdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080094 /* External 5V regulator enable; shared by HDMI and USB_OTG switches. */
Jay Chokshi06fa7542011-12-07 13:09:17 -080095 PM8XXX_MPP_INIT(3, D_INPUT, PM8038_MPP_DIG_LEVEL_VPH, DIN_TO_INT),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080096};
97
Jay Chokshi06fa7542011-12-07 13:09:17 -080098void __init msm8930_pm8038_gpio_mpp_init(void)
Stepan Moskovchenko39236d72011-11-30 17:42:23 -080099{
100 int i, rc;
101
Jay Chokshi06fa7542011-12-07 13:09:17 -0800102 for (i = 0; i < ARRAY_SIZE(pm8038_gpios); i++) {
103 rc = pm8xxx_gpio_config(pm8038_gpios[i].gpio,
104 &pm8038_gpios[i].config);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800105 if (rc) {
106 pr_err("%s: pm8xxx_gpio_config: rc=%d\n", __func__, rc);
107 break;
108 }
109 }
110
Jay Chokshi06fa7542011-12-07 13:09:17 -0800111 /* Initial MPP configuration. */
112 for (i = 0; i < ARRAY_SIZE(pm8038_mpps); i++) {
113 rc = pm8xxx_mpp_config(pm8038_mpps[i].mpp,
114 &pm8038_mpps[i].config);
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800115 if (rc) {
116 pr_err("%s: pm8xxx_mpp_config: rc=%d\n", __func__, rc);
117 break;
118 }
119 }
120}
121
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800122static struct pm8xxx_irq_platform_data pm8xxx_irq_pdata __devinitdata = {
Jay Chokshi06fa7542011-12-07 13:09:17 -0800123 .irq_base = PM8038_IRQ_BASE,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800124 .devirq = MSM_GPIO_TO_INT(104),
125 .irq_trigger_flag = IRQF_TRIGGER_LOW,
126};
127
128static struct pm8xxx_gpio_platform_data pm8xxx_gpio_pdata __devinitdata = {
Jay Chokshi06fa7542011-12-07 13:09:17 -0800129 .gpio_base = PM8038_GPIO_PM_TO_SYS(1),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800130};
131
132static struct pm8xxx_mpp_platform_data pm8xxx_mpp_pdata __devinitdata = {
Jay Chokshi06fa7542011-12-07 13:09:17 -0800133 .mpp_base = PM8038_MPP_PM_TO_SYS(1),
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800134};
135
136static struct pm8xxx_rtc_platform_data pm8xxx_rtc_pdata __devinitdata = {
Jay Chokshi06fa7542011-12-07 13:09:17 -0800137 .rtc_write_enable = false,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800138 .rtc_alarm_powerup = false,
139};
140
141static struct pm8xxx_pwrkey_platform_data pm8xxx_pwrkey_pdata = {
142 .pull_up = 1,
143 .kpd_trigger_delay_us = 970,
144 .wakeup = 1,
145};
146
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800147static struct pm8xxx_misc_platform_data pm8xxx_misc_pdata = {
148 .priority = 0,
149};
150
Jay Chokshi06fa7542011-12-07 13:09:17 -0800151static struct pm8038_platform_data pm8038_platform_data __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800152 .irq_pdata = &pm8xxx_irq_pdata,
153 .gpio_pdata = &pm8xxx_gpio_pdata,
154 .mpp_pdata = &pm8xxx_mpp_pdata,
155 .rtc_pdata = &pm8xxx_rtc_pdata,
156 .pwrkey_pdata = &pm8xxx_pwrkey_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800157 .misc_pdata = &pm8xxx_misc_pdata,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800158};
159
Jay Chokshi06fa7542011-12-07 13:09:17 -0800160static struct msm_ssbi_platform_data msm8930_ssbi_pm8038_pdata __devinitdata = {
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800161 .controller_type = MSM_SBI_CTRL_PMIC_ARBITER,
162 .slave = {
Jay Chokshi06fa7542011-12-07 13:09:17 -0800163 .name = "pm8038-core",
164 .platform_data = &pm8038_platform_data,
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800165 },
166};
167
168void __init msm8930_init_pmic(void)
169{
Jay Chokshi06fa7542011-12-07 13:09:17 -0800170 pmic_reset_irq = PM8038_IRQ_BASE + PM8038_RESOUT_IRQ;
Jay Chokshi33c044a2011-12-07 13:05:40 -0800171 msm8960_device_ssbi_pmic.dev.platform_data =
Jay Chokshi06fa7542011-12-07 13:09:17 -0800172 &msm8930_ssbi_pm8038_pdata;
Stepan Moskovchenko39236d72011-11-30 17:42:23 -0800173}