blob: b84bb913b24f4b169447f5bc5bc661176d7ef9d5 [file] [log] [blame]
Channagoud Kadabif8ad8e72015-01-06 15:10:13 -08001/* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
Channagoud Kadabied60a8b2014-06-27 15:35:09 -07002 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
Sridhar Parasuram568e7a62015-08-06 13:16:02 -070021 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, nit
22 * PROCUREMENT OF
Channagoud Kadabied60a8b2014-06-27 15:35:09 -070023 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include <debug.h>
31#include <platform/iomap.h>
32#include <platform/irqs.h>
33#include <platform/gpio.h>
34#include <reg.h>
35#include <target.h>
36#include <platform.h>
37#include <dload_util.h>
38#include <uart_dm.h>
39#include <mmc.h>
40#include <spmi.h>
41#include <board.h>
42#include <smem.h>
43#include <baseband.h>
Sridhar Parasuramd75ade52015-03-09 15:45:16 -070044#include <regulator.h>
Channagoud Kadabied60a8b2014-06-27 15:35:09 -070045#include <dev/keys.h>
46#include <pm8x41.h>
47#include <crypto5_wrapper.h>
48#include <clock.h>
49#include <partition_parser.h>
50#include <scm.h>
51#include <platform/clock.h>
52#include <platform/gpio.h>
53#include <platform/timer.h>
54#include <stdlib.h>
55#include <ufs.h>
56#include <boot_device.h>
57#include <qmp_phy.h>
Channagoud Kadabi7d308202014-12-22 12:07:04 -080058#include <sdhci_msm.h>
59#include <qusb2_phy.h>
Sridhar Parasuram568e7a62015-08-06 13:16:02 -070060#include <secapp_loader.h>
Channagoud Kadabi2bab29b2015-02-11 13:26:03 -080061#include <rpmb.h>
Sridhar Parasuram9f28f672015-03-17 15:40:47 -070062#include <rpm-glink.h>
Channagoud Kadabibb8f1f92015-04-27 11:14:45 -070063#if ENABLE_WBC
64#include <pm_app_smbchg.h>
65#endif
Channagoud Kadabied60a8b2014-06-27 15:35:09 -070066
c_wufengf433f232015-09-21 15:21:21 +080067#if LONG_PRESS_POWER_ON
68#include <shutdown_detect.h>
69#endif
70
c_wufeng196210d2015-09-21 12:49:43 +080071#if PON_VIB_SUPPORT
72#include <vibrator.h>
73#define VIBRATE_TIME 250
74#endif
c_wufengf433f232015-09-21 15:21:21 +080075
Channagoud Kadabi4a870cf2015-01-21 10:39:01 -080076#define CE_INSTANCE 1
Channagoud Kadabi7edb9b42015-08-11 23:45:31 -070077#define CE_EE 0
Channagoud Kadabi4a870cf2015-01-21 10:39:01 -080078#define CE_FIFO_SIZE 64
79#define CE_READ_PIPE 3
80#define CE_WRITE_PIPE 2
81#define CE_READ_PIPE_LOCK_GRP 0
82#define CE_WRITE_PIPE_LOCK_GRP 0
83#define CE_ARRAY_SIZE 20
84
Channagoud Kadabied60a8b2014-06-27 15:35:09 -070085#define PMIC_ARB_CHANNEL_NUM 0
86#define PMIC_ARB_OWNER_ID 0
87
88static void set_sdc_power_ctrl(void);
89static uint32_t mmc_pwrctl_base[] =
90 { MSM_SDC1_BASE, MSM_SDC2_BASE };
91
92static uint32_t mmc_sdhci_base[] =
93 { MSM_SDC1_SDHCI_BASE, MSM_SDC2_SDHCI_BASE };
94
95static uint32_t mmc_sdc_pwrctl_irq[] =
96 { SDCC1_PWRCTL_IRQ, SDCC2_PWRCTL_IRQ };
97
98struct mmc_device *dev;
99struct ufs_dev ufs_device;
100
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700101void target_early_init(void)
102{
103#if WITH_DEBUG_UART
Channagoud Kadabi35503c42014-11-14 16:22:43 -0800104 uart_dm_init(8, 0, BLSP2_UART1_BASE);
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700105#endif
106}
107
108/* Return 1 if vol_up pressed */
Amit Blay6a3e88b2015-06-23 22:25:06 +0300109int target_volume_up()
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700110{
lijuang2d2b8a02015-06-05 21:34:15 +0800111 static uint8_t first_time = 0;
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700112 uint8_t status = 0;
113 struct pm8x41_gpio gpio;
114
lijuang2d2b8a02015-06-05 21:34:15 +0800115 if (!first_time) {
116 /* Configure the GPIO */
117 gpio.direction = PM_GPIO_DIR_IN;
118 gpio.function = 0;
119 gpio.pull = PM_GPIO_PULL_UP_30;
120 gpio.vin_sel = 2;
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700121
lijuang2d2b8a02015-06-05 21:34:15 +0800122 pm8x41_gpio_config(2, &gpio);
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700123
lijuang2d2b8a02015-06-05 21:34:15 +0800124 /* Wait for the pmic gpio config to take effect */
125 udelay(10000);
126
127 first_time = 1;
128 }
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700129
130 /* Get status of P_GPIO_5 */
Channagoud Kadabi99d23702015-02-02 20:52:17 -0800131 pm8x41_gpio_get(2, &status);
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700132
133 return !status; /* active low */
134}
135
136/* Return 1 if vol_down pressed */
137uint32_t target_volume_down()
138{
139 return pm8x41_resin_status();
140}
141
142static void target_keystatus()
143{
144 keys_init();
145
146 if(target_volume_down())
147 keys_post_event(KEY_VOLUMEDOWN, 1);
148
149 if(target_volume_up())
150 keys_post_event(KEY_VOLUMEUP, 1);
151}
152
153void target_uninit(void)
154{
155 if (platform_boot_dev_isemmc())
156 {
157 mmc_put_card_to_sleep(dev);
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700158 }
Channagoud Kadabi2bab29b2015-02-11 13:26:03 -0800159
160 if (is_sec_app_loaded())
161 {
Sridhar Parasuram568e7a62015-08-06 13:16:02 -0700162 if (send_milestone_call_to_tz() < 0)
Channagoud Kadabi2bab29b2015-02-11 13:26:03 -0800163 {
164 dprintf(CRITICAL, "Failed to unload App for rpmb\n");
165 ASSERT(0);
166 }
167 }
168
Channagoud Kadabibb8f1f92015-04-27 11:14:45 -0700169#if ENABLE_WBC
Channagoud Kadabi22165612015-07-22 14:04:37 -0700170 if (board_hardware_id() == HW_PLATFORM_MTP)
171 pm_appsbl_set_dcin_suspend(1);
Channagoud Kadabibb8f1f92015-04-27 11:14:45 -0700172#endif
173
Channagoud Kadabi7edb9b42015-08-11 23:45:31 -0700174
175 if (crypto_initialized())
176 {
177 crypto_eng_cleanup();
178 clock_ce_disable(CE_INSTANCE);
179 }
180
Sridhar Parasuram9f28f672015-03-17 15:40:47 -0700181 /* Tear down glink channels */
182 rpm_glink_uninit();
183
Channagoud Kadabi2bab29b2015-02-11 13:26:03 -0800184 if (rpmb_uninit() < 0)
185 {
186 dprintf(CRITICAL, "RPMB uninit failed\n");
187 ASSERT(0);
188 }
189
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700190}
191
192static void set_sdc_power_ctrl()
193{
194 /* Drive strength configs for sdc pins */
195 struct tlmm_cfgs sdc1_hdrv_cfg[] =
196 {
197 { SDC1_CLK_HDRV_CTL_OFF, TLMM_CUR_VAL_16MA, TLMM_HDRV_MASK, SDC1_HDRV_PULL_CTL },
198 { SDC1_CMD_HDRV_CTL_OFF, TLMM_CUR_VAL_10MA, TLMM_HDRV_MASK, SDC1_HDRV_PULL_CTL },
199 { SDC1_DATA_HDRV_CTL_OFF, TLMM_CUR_VAL_10MA, TLMM_HDRV_MASK, SDC1_HDRV_PULL_CTL },
200 };
201
202 /* Pull configs for sdc pins */
203 struct tlmm_cfgs sdc1_pull_cfg[] =
204 {
205 { SDC1_CLK_PULL_CTL_OFF, TLMM_NO_PULL, TLMM_PULL_MASK, SDC1_HDRV_PULL_CTL },
206 { SDC1_CMD_PULL_CTL_OFF, TLMM_PULL_UP, TLMM_PULL_MASK, SDC1_HDRV_PULL_CTL },
207 { SDC1_DATA_PULL_CTL_OFF, TLMM_PULL_UP, TLMM_PULL_MASK, SDC1_HDRV_PULL_CTL },
208 };
209
210 struct tlmm_cfgs sdc1_rclk_cfg[] =
211 {
212 { SDC1_RCLK_PULL_CTL_OFF, TLMM_PULL_DOWN, TLMM_PULL_MASK, SDC1_HDRV_PULL_CTL },
213 };
214
215 /* Set the drive strength & pull control values */
216 tlmm_set_hdrive_ctrl(sdc1_hdrv_cfg, ARRAY_SIZE(sdc1_hdrv_cfg));
217 tlmm_set_pull_ctrl(sdc1_pull_cfg, ARRAY_SIZE(sdc1_pull_cfg));
218 tlmm_set_pull_ctrl(sdc1_rclk_cfg, ARRAY_SIZE(sdc1_rclk_cfg));
219}
220
c_wufengf433f232015-09-21 15:21:21 +0800221uint32_t target_is_pwrkey_pon_reason()
222{
223 uint8_t pon_reason = pm8950_get_pon_reason();
224 if (pm8x41_get_is_cold_boot() && ((pon_reason == KPDPWR_N) || (pon_reason == (KPDPWR_N|PON1))))
225 return 1;
226 else
227 return 0;
228}
229
230
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700231void target_sdc_init()
232{
233 struct mmc_config_data config = {0};
234
235 /* Set drive strength & pull ctrl values */
236 set_sdc_power_ctrl();
237
238 config.bus_width = DATA_BUS_WIDTH_8BIT;
239 config.max_clk_rate = MMC_CLK_192MHZ;
Channagoud Kadabi99d23702015-02-02 20:52:17 -0800240 config.hs400_support = 1;
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700241
242 /* Try slot 1*/
243 config.slot = 1;
244 config.sdhc_base = mmc_sdhci_base[config.slot - 1];
245 config.pwrctl_base = mmc_pwrctl_base[config.slot - 1];
246 config.pwr_irq = mmc_sdc_pwrctl_irq[config.slot - 1];
247
248 if (!(dev = mmc_init(&config)))
249 {
250 /* Try slot 2 */
251 config.slot = 2;
252 config.max_clk_rate = MMC_CLK_200MHZ;
253 config.sdhc_base = mmc_sdhci_base[config.slot - 1];
254 config.pwrctl_base = mmc_pwrctl_base[config.slot - 1];
255 config.pwr_irq = mmc_sdc_pwrctl_irq[config.slot - 1];
256
257 if (!(dev = mmc_init(&config)))
258 {
259 dprintf(CRITICAL, "mmc init failed!");
260 ASSERT(0);
261 }
262 }
263}
264
265void *target_mmc_device()
266{
267 if (platform_boot_dev_isemmc())
268 return (void *) dev;
269 else
270 return (void *) &ufs_device;
271}
272
273void target_init(void)
274{
Sridhar Parasuram568e7a62015-08-06 13:16:02 -0700275 int ret = 0;
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700276 dprintf(INFO, "target_init()\n");
277
Sridhar Parasuram1d224322015-06-15 11:03:40 -0700278 pmic_info_populate();
279
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700280 spmi_init(PMIC_ARB_CHANNEL_NUM, PMIC_ARB_OWNER_ID);
281
Channagoud Kadabibb8f1f92015-04-27 11:14:45 -0700282 /* Initialize Glink */
283 rpm_glink_init();
284
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700285 target_keystatus();
286
c_wufengf433f232015-09-21 15:21:21 +0800287#if defined(LONG_PRESS_POWER_ON) || defined(PON_VIB_SUPPORT)
288 switch(board_hardware_id())
289 {
290 case HW_PLATFORM_QRD:
291#if LONG_PRESS_POWER_ON
292 shutdown_detect();
293#endif
c_wufeng196210d2015-09-21 12:49:43 +0800294#if PON_VIB_SUPPORT
295 vib_timed_turn_on(VIBRATE_TIME);
296#endif
c_wufengf433f232015-09-21 15:21:21 +0800297 break;
298 }
299#endif
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700300
301 if (target_use_signed_kernel())
302 target_crypto_init_params();
303
304 platform_read_boot_config();
305
Sridhar Parasuram50b9d962015-02-12 11:28:09 -0800306#ifdef MMC_SDHCI_SUPPORT
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700307 if (platform_boot_dev_isemmc())
308 {
309 target_sdc_init();
310 }
Sridhar Parasuram50b9d962015-02-12 11:28:09 -0800311#endif
312#ifdef UFS_SUPPORT
313 if (!platform_boot_dev_isemmc())
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700314 {
315 ufs_device.base = UFS_BASE;
316 ufs_init(&ufs_device);
317 }
Sridhar Parasuram50b9d962015-02-12 11:28:09 -0800318#endif
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700319
320 /* Storage initialization is complete, read the partition table info */
Channagoud Kadabi58a273b2015-02-10 12:56:22 -0800321 mmc_read_partition_table(0);
Channagoud Kadabi2bab29b2015-02-11 13:26:03 -0800322
Channagoud Kadabi1171d8d2015-07-30 19:12:44 -0700323#if ENABLE_WBC
324 /* Look for battery voltage and make sure we have enough to bootup
325 * Otherwise initiate battery charging
326 * Charging should happen as early as possible, any other driver
327 * initialization before this should consider the power impact
328 */
Channagoud Kadabi25fd8ce2015-08-19 14:45:08 -0700329 switch(board_hardware_id())
330 {
331 case HW_PLATFORM_MTP:
332 case HW_PLATFORM_FLUID:
lijuang0e98add2015-11-10 10:40:27 +0800333 case HW_PLATFORM_QRD:
Channagoud Kadabi25fd8ce2015-08-19 14:45:08 -0700334 pm_appsbl_chg_check_weak_battery_status(1);
335 break;
336 default:
337 /* Charging not supported */
338 break;
339 };
Channagoud Kadabi1171d8d2015-07-30 19:12:44 -0700340#endif
341
Sridhar Parasuram568e7a62015-08-06 13:16:02 -0700342 /* Initialize Qseecom */
343 ret = qseecom_init();
344
345 if (ret < 0)
346 {
347 dprintf(CRITICAL, "Failed to initialize qseecom, error: %d\n", ret);
348 ASSERT(0);
349 }
350
351 /* Start Qseecom */
352 ret = qseecom_tz_init();
353
354 if (ret < 0)
355 {
356 dprintf(CRITICAL, "Failed to start qseecom, error: %d\n", ret);
357 ASSERT(0);
358 }
359
Sridhar Parasuramc61ecc22015-09-22 13:53:31 -0700360 if (rpmb_init() < 0)
361 {
362 dprintf(CRITICAL, "RPMB init failed\n");
363 ASSERT(0);
364 }
365
Sridhar Parasuram568e7a62015-08-06 13:16:02 -0700366 /*
367 * Load the sec app for first time
368 */
369 if (load_sec_app() < 0)
370 {
371 dprintf(CRITICAL, "Failed to load App for verified\n");
372 ASSERT(0);
373 }
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700374}
375
376unsigned board_machtype(void)
377{
378 return LINUX_MACHTYPE_UNKNOWN;
379}
380
381/* Detect the target type */
382void target_detect(struct board_data *board)
383{
384 /* This is filled from board.c */
385}
386
Dhaval Patelb95039c2015-03-16 11:14:06 -0700387static uint8_t splash_override;
388/* Returns 1 if target supports continuous splash screen. */
389int target_cont_splash_screen()
390{
391 uint8_t splash_screen = 0;
Channagoud Kadabi25fd8ce2015-08-19 14:45:08 -0700392 if(!splash_override && !pm_appsbl_charging_in_progress()) {
Dhaval Patelb95039c2015-03-16 11:14:06 -0700393 switch(board_hardware_id())
394 {
395 case HW_PLATFORM_SURF:
396 case HW_PLATFORM_MTP:
397 case HW_PLATFORM_FLUID:
feifanz76fe6482015-09-02 15:25:16 +0800398 case HW_PLATFORM_QRD:
Kuogee Hsiehb976dfc2015-08-28 13:21:30 -0700399 case HW_PLATFORM_LIQUID:
Dhaval Patelb95039c2015-03-16 11:14:06 -0700400 dprintf(SPEW, "Target_cont_splash=1\n");
401 splash_screen = 1;
402 break;
403 default:
404 dprintf(SPEW, "Target_cont_splash=0\n");
405 splash_screen = 0;
406 }
407 }
408 return splash_screen;
409}
410
411void target_force_cont_splash_disable(uint8_t override)
412{
413 splash_override = override;
414}
415
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700416/* Detect the modem type */
417void target_baseband_detect(struct board_data *board)
418{
419 uint32_t platform;
420
421 platform = board->platform;
422
423 switch(platform) {
Channagoud Kadabi439df822015-05-26 11:14:16 -0700424 case APQ8096:
425 board->baseband = BASEBAND_APQ;
426 break;
Channagoud Kadabi4a4c05e2015-03-30 15:18:58 -0700427 case MSM8996:
Channagoud Kadabi99d23702015-02-02 20:52:17 -0800428 if (board->platform_version == 0x10000)
429 board->baseband = BASEBAND_APQ;
430 else
431 board->baseband = BASEBAND_MSM;
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700432 break;
433 default:
434 dprintf(CRITICAL, "Platform type: %u is not supported\n",platform);
435 ASSERT(0);
436 };
437}
438unsigned target_baseband()
439{
440 return board_baseband();
441}
442
443void target_serialno(unsigned char *buf)
444{
445 unsigned int serialno;
446 if (target_is_emmc_boot()) {
447 serialno = mmc_get_psn();
448 snprintf((char *)buf, 13, "%x", serialno);
449 }
450}
451
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700452int emmc_recovery_init(void)
453{
454 return _emmc_recovery_init();
455}
456
457void target_usb_phy_reset()
458{
459 usb30_qmp_phy_reset();
460 qusb2_phy_reset();
461}
462
463target_usb_iface_t* target_usb30_init()
464{
465 target_usb_iface_t *t_usb_iface;
466
467 t_usb_iface = calloc(1, sizeof(target_usb_iface_t));
468 ASSERT(t_usb_iface);
469
470 t_usb_iface->phy_init = usb30_qmp_phy_init;
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700471 t_usb_iface->phy_reset = target_usb_phy_reset;
472 t_usb_iface->clock_init = clock_usb30_init;
473 t_usb_iface->vbus_override = 1;
474
475 return t_usb_iface;
476}
477
478/* identify the usb controller to be used for the target */
479const char * target_usb_controller()
480{
481 return "dwc";
482}
483
484uint32_t target_override_pll()
485{
Channagoud Kadabi1e5144b2015-04-28 17:15:05 -0700486 if (board_soc_version() >= 0x20000)
487 return 0;
488 else
489 return 1;
Channagoud Kadabied60a8b2014-06-27 15:35:09 -0700490}
491
Channagoud Kadabi4a870cf2015-01-21 10:39:01 -0800492crypto_engine_type board_ce_type(void)
493{
Channagoud Kadabi7edb9b42015-08-11 23:45:31 -0700494 return CRYPTO_ENGINE_TYPE_HW;
Channagoud Kadabi4a870cf2015-01-21 10:39:01 -0800495}
496
497/* Set up params for h/w CE. */
498void target_crypto_init_params()
499{
500 struct crypto_init_params ce_params;
501
502 /* Set up base addresses and instance. */
503 ce_params.crypto_instance = CE_INSTANCE;
504 ce_params.crypto_base = MSM_CE_BASE;
505 ce_params.bam_base = MSM_CE_BAM_BASE;
506
507 /* Set up BAM config. */
508 ce_params.bam_ee = CE_EE;
509 ce_params.pipes.read_pipe = CE_READ_PIPE;
510 ce_params.pipes.write_pipe = CE_WRITE_PIPE;
511 ce_params.pipes.read_pipe_grp = CE_READ_PIPE_LOCK_GRP;
512 ce_params.pipes.write_pipe_grp = CE_WRITE_PIPE_LOCK_GRP;
513
514 /* Assign buffer sizes. */
515 ce_params.num_ce = CE_ARRAY_SIZE;
516 ce_params.read_fifo_size = CE_FIFO_SIZE;
517 ce_params.write_fifo_size = CE_FIFO_SIZE;
518
519 /* BAM is initialized by TZ for this platform.
520 * Do not do it again as the initialization address space
521 * is locked.
522 */
523 ce_params.do_bam_init = 0;
524
525 crypto_init_params(&ce_params);
526}
Channagoud Kadabi083290f2015-03-13 14:18:38 -0700527
528unsigned target_pause_for_battery_charge(void)
529{
530 uint8_t pon_reason = pm8x41_get_pon_reason();
531 uint8_t is_cold_boot = pm8x41_get_is_cold_boot();
532 dprintf(INFO, "%s : pon_reason is %d cold_boot:%d\n", __func__,
533 pon_reason, is_cold_boot);
534 /* In case of fastboot reboot,adb reboot or if we see the power key
535 * pressed we do not want go into charger mode.
536 * fastboot reboot is warm boot with PON hard reset bit not set
537 * adb reboot is a cold boot with PON hard reset bit set
538 */
539 if (is_cold_boot &&
540 (!(pon_reason & HARD_RST)) &&
541 (!(pon_reason & KPDPWR_N)) &&
542 ((pon_reason & PON1)))
543 return 1;
544 else
545 return 0;
546}
Channagoud Kadabi23edc0c2015-03-27 18:31:32 -0700547
548int set_download_mode(enum dload_mode mode)
549{
550 int ret = 0;
551 ret = scm_dload_mode(mode);
552
553 return ret;
554}
Channagoud Kadabiffc4b902015-06-25 23:14:27 -0700555
Channagoud Kadabi65b518d2015-08-05 16:17:14 -0700556void pmic_reset_configure(uint8_t reset_type)
Channagoud Kadabiffc4b902015-06-25 23:14:27 -0700557{
Channagoud Kadabi65b518d2015-08-05 16:17:14 -0700558 pm8994_reset_configure(reset_type);
Channagoud Kadabiffc4b902015-06-25 23:14:27 -0700559}
lijuang3606df82015-09-02 21:14:43 +0800560
561uint32_t target_get_pmic()
562{
563 return PMIC_IS_PMI8996;
564}