blob: cd9b82e923b69c2d19fcf9e424652e26b4008bfd [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>
Jeff Hugo7cc06b12013-06-17 16:13:18 -060048#include <mach/msm_smem.h>
Praveen Chidambaram52380712012-12-20 16:51:11 -070049#include <linux/msm_thermal.h>
Rohit Vaswani90e30232012-10-10 16:52:37 -070050#include "board-dt.h"
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -070051#include "clock.h"
Syed Rameez Mustafa9de46342012-11-30 11:00:08 -080052#include "platsmp.h"
Praveen Chidambaram52380712012-12-20 16:51:11 -070053#include "spm.h"
Mahesh Sivasubramanian59ffcb02013-05-31 15:08:15 -060054#include "pm.h"
Jeff Hugoa50514f2013-03-14 14:40:35 -060055#include "modem_notifier.h"
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -070056
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080057static struct memtype_reserve msm8610_reserve_table[] __initdata = {
Neeti Desai1c638102012-11-09 16:08:11 -080058 [MEMTYPE_SMI] = {
59 },
60 [MEMTYPE_EBI0] = {
61 .flags = MEMTYPE_FLAGS_1M_ALIGN,
62 },
63 [MEMTYPE_EBI1] = {
64 .flags = MEMTYPE_FLAGS_1M_ALIGN,
65 },
66};
67
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080068static int msm8610_paddr_to_memtype(unsigned int paddr)
Neeti Desai1c638102012-11-09 16:08:11 -080069{
70 return MEMTYPE_EBI1;
71}
72
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080073static struct of_dev_auxdata msm8610_auxdata_lookup[] __initdata = {
David Ngb5bac062012-11-02 00:00:12 -070074 OF_DEV_AUXDATA("qcom,msm-sdcc", 0xF9824000, \
75 "msm_sdcc.1", NULL),
76 OF_DEV_AUXDATA("qcom,msm-sdcc", 0xF98A4000, \
77 "msm_sdcc.2", NULL),
Venkat Gopalakrishnan44395b92013-04-05 12:31:13 -070078 OF_DEV_AUXDATA("qcom,sdhci-msm", 0xF9824900, \
79 "msm_sdcc.1", NULL),
80 OF_DEV_AUXDATA("qcom,sdhci-msm", 0xF98A4900, \
81 "msm_sdcc.2", NULL),
David Ngb5bac062012-11-02 00:00:12 -070082 {}
83};
84
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080085static struct reserve_info msm8610_reserve_info __initdata = {
86 .memtype_reserve_table = msm8610_reserve_table,
87 .paddr_to_memtype = msm8610_paddr_to_memtype,
Neeti Desai1c638102012-11-09 16:08:11 -080088};
89
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080090static void __init msm8610_early_memory(void)
Neeti Desai1c638102012-11-09 16:08:11 -080091{
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080092 reserve_info = &msm8610_reserve_info;
Neeti Desai2a575be2012-11-26 12:53:10 -080093 of_scan_flat_dt(dt_scan_for_memory_hole, msm8610_reserve_table);
Neeti Desai1c638102012-11-09 16:08:11 -080094}
95
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -080096static void __init msm8610_reserve(void)
Neeti Desai1c638102012-11-09 16:08:11 -080097{
Neeti Desai2a575be2012-11-26 12:53:10 -080098 reserve_info = &msm8610_reserve_info;
99 of_scan_flat_dt(dt_scan_for_memory_reserve, msm8610_reserve_table);
Neeti Desai1c638102012-11-09 16:08:11 -0800100 msm_reserve();
101}
102
Praveen Chidambaram52380712012-12-20 16:51:11 -0700103void __init msm8610_add_drivers(void)
104{
Jeff Hugo7cc06b12013-06-17 16:13:18 -0600105 msm_smem_init();
Jeff Hugoa50514f2013-03-14 14:40:35 -0600106 msm_init_modem_notifier_list();
107 msm_smd_init();
Praveen Chidambaram52380712012-12-20 16:51:11 -0700108 msm_rpm_driver_init();
Praveen Chidambaram52380712012-12-20 16:51:11 -0700109 msm_spm_device_init();
Mahesh Sivasubramanian59ffcb02013-05-31 15:08:15 -0600110 msm_pm_sleep_status_init();
Xiaozhe Shif33ce3b2013-04-09 17:13:42 -0700111 rpm_regulator_smd_driver_init();
Xiaozhe Shie4284532013-03-13 16:03:09 -0700112 qpnp_regulator_init();
Siddartha Mohanadoss4cef5f42013-04-11 13:59:41 -0700113 tsens_tm_init_driver();
Praveen Chidambaram52380712012-12-20 16:51:11 -0700114 msm_thermal_device_init();
Vikram Mulukutlad682cd82013-01-24 12:32:36 -0800115
Stepan Moskovchenko82f0eab2013-04-02 19:52:28 -0700116 if (of_board_is_rumi())
Vikram Mulukutlad682cd82013-01-24 12:32:36 -0800117 msm_clock_init(&msm8610_rumi_clock_init_data);
118 else
119 msm_clock_init(&msm8610_clock_init_data);
Praveen Chidambaram52380712012-12-20 16:51:11 -0700120}
121
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800122void __init msm8610_init(void)
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -0700123{
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800124 struct of_dev_auxdata *adata = msm8610_auxdata_lookup;
Abhimanyu Kapur440cdde2012-12-04 00:05:40 -0800125
Abhimanyu Kapur91a0a502013-01-11 19:24:59 -0800126 if (socinfo_init() < 0)
Abhimanyu Kapur440cdde2012-12-04 00:05:40 -0800127 pr_err("%s: socinfo_init() failed\n", __func__);
David Ngb5bac062012-11-02 00:00:12 -0700128
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800129 msm8610_init_gpiomux();
Stepan Moskovchenko7d8cdcaa2013-04-25 17:10:55 -0700130 board_dt_populate(adata);
Vikram Mulukutlad682cd82013-01-24 12:32:36 -0800131 msm8610_add_drivers();
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -0700132}
133
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800134static const char *msm8610_dt_match[] __initconst = {
135 "qcom,msm8610",
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -0700136 NULL
137};
138
David Ngaeaf2522014-02-26 16:42:25 -0800139DT_MACHINE_START(MSM8610_DT, "Qualcomm MSM 8x10 / MSM 8x12 (Flattened Device Tree)")
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800140 .map_io = msm_map_msm8610_io,
Praveen Chidambaram52380712012-12-20 16:51:11 -0700141 .init_irq = msm_dt_init_irq,
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800142 .init_machine = msm8610_init,
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -0700143 .handle_irq = gic_handle_irq,
Rohit Vaswani90e30232012-10-10 16:52:37 -0700144 .timer = &msm_dt_timer,
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800145 .dt_compat = msm8610_dt_match,
Hanumant Singhe4271312012-10-24 13:27:57 -0700146 .restart = msm_restart,
Syed Rameez Mustafa3971c142013-01-09 19:04:53 -0800147 .reserve = msm8610_reserve,
148 .init_very_early = msm8610_early_memory,
Syed Rameez Mustafa9de46342012-11-30 11:00:08 -0800149 .smp = &arm_smp_ops,
Syed Rameez Mustafafd0f9b42012-09-21 18:33:36 -0700150MACHINE_END