blob: 962ed65e35936d36378a346c4b8a6f3cf40b5f71 [file] [log] [blame]
Abhimanyu Kapur440cdde2012-12-04 00:05:40 -08001/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -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
Abhimanyu Kapur440cdde2012-12-04 00:05:40 -080013#include <linux/err.h>
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -070014#include <linux/kernel.h>
15#include <linux/errno.h>
16#include <linux/platform_device.h>
17#include <linux/io.h>
18#include <linux/gpio.h>
19#include <linux/irq.h>
20#include <linux/irqdomain.h>
21#include <linux/of.h>
22#include <linux/of_address.h>
23#include <linux/of_platform.h>
24#include <linux/of_fdt.h>
25#include <linux/of_irq.h>
26#include <linux/memory.h>
Siddartha Mohanadoss4cef5f42013-04-11 13:59:41 -070027#include <linux/msm_tsens.h>
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -070028#include <asm/mach/map.h>
29#include <asm/arch_timer.h>
30#include <asm/hardware/gic.h>
31#include <asm/mach/arch.h>
32#include <asm/mach/time.h>
33#include <mach/board.h>
34#include <mach/gpiomux.h>
35#include <mach/msm_iomap.h>
Hanumant Singhe4271312012-10-24 13:27:57 -070036#include <mach/restart.h>
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -070037#ifdef CONFIG_ION_MSM
38#include <mach/ion.h>
39#endif
Xiaozhe Shie4284532013-03-13 16:03:09 -070040#include <linux/regulator/qpnp-regulator.h>
Neeti Desai1c638102012-11-09 16:08:11 -080041#include <mach/msm_memtypes.h>
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -070042#include <mach/socinfo.h>
43#include <mach/board.h>
44#include <mach/clk-provider.h>
Praveen Chidambaram52380712012-12-20 16:51:11 -070045#include <mach/msm_smd.h>
46#include <mach/rpm-smd.h>
Xiaozhe Shif33ce3b2013-04-09 17:13:42 -070047#include <mach/rpm-regulator-smd.h>
Praveen Chidambaram52380712012-12-20 16:51:11 -070048#include <linux/msm_thermal.h>
Rohit Vaswani90e30232012-10-10 16:52:37 -070049#include "board-dt.h"
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -070050#include "clock.h"
Syed Rameez Mustafa9de46342012-11-30 11:00:08 -080051#include "platsmp.h"
Praveen Chidambaram52380712012-12-20 16:51:11 -070052#include "spm.h"
53#include "lpm_resources.h"
Jeff Hugoa50514f2013-03-14 14:40:35 -060054#include "modem_notifier.h"
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -070055
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080056static struct memtype_reserve msm8610_reserve_table[] __initdata = {
Neeti Desai1c638102012-11-09 16:08:11 -080057 [MEMTYPE_SMI] = {
58 },
59 [MEMTYPE_EBI0] = {
60 .flags = MEMTYPE_FLAGS_1M_ALIGN,
61 },
62 [MEMTYPE_EBI1] = {
63 .flags = MEMTYPE_FLAGS_1M_ALIGN,
64 },
65};
66
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080067static int msm8610_paddr_to_memtype(unsigned int paddr)
Neeti Desai1c638102012-11-09 16:08:11 -080068{
69 return MEMTYPE_EBI1;
70}
71
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080072static struct of_dev_auxdata msm8610_auxdata_lookup[] __initdata = {
David Ngb5bac062012-11-02 00:00:12 -070073 OF_DEV_AUXDATA("qcom,msm-sdcc", 0xF9824000, \
74 "msm_sdcc.1", NULL),
75 OF_DEV_AUXDATA("qcom,msm-sdcc", 0xF98A4000, \
76 "msm_sdcc.2", NULL),
Venkat Gopalakrishnan44395b92013-04-05 12:31:13 -070077 OF_DEV_AUXDATA("qcom,sdhci-msm", 0xF9824900, \
78 "msm_sdcc.1", NULL),
79 OF_DEV_AUXDATA("qcom,sdhci-msm", 0xF98A4900, \
80 "msm_sdcc.2", NULL),
David Ngb5bac062012-11-02 00:00:12 -070081 {}
82};
83
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080084static struct reserve_info msm8610_reserve_info __initdata = {
85 .memtype_reserve_table = msm8610_reserve_table,
86 .paddr_to_memtype = msm8610_paddr_to_memtype,
Neeti Desai1c638102012-11-09 16:08:11 -080087};
88
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080089static void __init msm8610_early_memory(void)
Neeti Desai1c638102012-11-09 16:08:11 -080090{
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080091 reserve_info = &msm8610_reserve_info;
Neeti Desai2a575be2012-11-26 12:53:10 -080092 of_scan_flat_dt(dt_scan_for_memory_hole, msm8610_reserve_table);
Neeti Desai1c638102012-11-09 16:08:11 -080093}
94
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080095static void __init msm8610_reserve(void)
Neeti Desai1c638102012-11-09 16:08:11 -080096{
Neeti Desai2a575be2012-11-26 12:53:10 -080097 reserve_info = &msm8610_reserve_info;
98 of_scan_flat_dt(dt_scan_for_memory_reserve, msm8610_reserve_table);
Neeti Desai1c638102012-11-09 16:08:11 -080099 msm_reserve();
100}
101
Praveen Chidambaram52380712012-12-20 16:51:11 -0700102void __init msm8610_add_drivers(void)
103{
Jeff Hugoa50514f2013-03-14 14:40:35 -0600104 msm_init_modem_notifier_list();
105 msm_smd_init();
Praveen Chidambaram52380712012-12-20 16:51:11 -0700106 msm_rpm_driver_init();
107 msm_lpmrs_module_init();
108 msm_spm_device_init();
Xiaozhe Shif33ce3b2013-04-09 17:13:42 -0700109 rpm_regulator_smd_driver_init();
Xiaozhe Shie4284532013-03-13 16:03:09 -0700110 qpnp_regulator_init();
Siddartha Mohanadoss4cef5f42013-04-11 13:59:41 -0700111 tsens_tm_init_driver();
Praveen Chidambaram52380712012-12-20 16:51:11 -0700112 msm_thermal_device_init();
Vikram Mulukutlad682cd82013-01-24 12:32:36 -0800113
Stepan Moskovchenko82f0eab2013-04-02 19:52:28 -0700114 if (of_board_is_rumi())
Vikram Mulukutlad682cd82013-01-24 12:32:36 -0800115 msm_clock_init(&msm8610_rumi_clock_init_data);
116 else
117 msm_clock_init(&msm8610_clock_init_data);
Praveen Chidambaram52380712012-12-20 16:51:11 -0700118}
119
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800120void __init msm8610_init(void)
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -0700121{
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800122 struct of_dev_auxdata *adata = msm8610_auxdata_lookup;
Abhimanyu Kapur440cdde2012-12-04 00:05:40 -0800123
Abhimanyu Kapur91a0a502013-01-11 19:24:59 -0800124 if (socinfo_init() < 0)
Abhimanyu Kapur440cdde2012-12-04 00:05:40 -0800125 pr_err("%s: socinfo_init() failed\n", __func__);
David Ngb5bac062012-11-02 00:00:12 -0700126
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800127 msm8610_init_gpiomux();
Stepan Moskovchenko7d8cdcaa2013-04-25 17:10:55 -0700128 board_dt_populate(adata);
Vikram Mulukutlad682cd82013-01-24 12:32:36 -0800129 msm8610_add_drivers();
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -0700130}
131
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800132static const char *msm8610_dt_match[] __initconst = {
133 "qcom,msm8610",
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -0700134 NULL
135};
136
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800137DT_MACHINE_START(MSM8610_DT, "Qualcomm MSM 8610 (Flattened Device Tree)")
138 .map_io = msm_map_msm8610_io,
Praveen Chidambaram52380712012-12-20 16:51:11 -0700139 .init_irq = msm_dt_init_irq,
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800140 .init_machine = msm8610_init,
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -0700141 .handle_irq = gic_handle_irq,
Rohit Vaswani90e30232012-10-10 16:52:37 -0700142 .timer = &msm_dt_timer,
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800143 .dt_compat = msm8610_dt_match,
Hanumant Singhe4271312012-10-24 13:27:57 -0700144 .restart = msm_restart,
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800145 .reserve = msm8610_reserve,
146 .init_very_early = msm8610_early_memory,
Syed Rameez Mustafa9de46342012-11-30 11:00:08 -0800147 .smp = &arm_smp_ops,
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -0700148MACHINE_END