blob: ff2869b4862427f7118d17b1abbbed6d0fe9b663 [file] [log] [blame]
Travis Geiselbrecht1d0df692008-09-01 02:26:09 -07001/*
Casey Pipera277d882013-10-21 10:11:04 -07002 * Copyright (c) 2008 Travis Geiselbrecht
Travis Geiselbrecht1d0df692008-09-01 02:26:09 -07003 *
lijuang395b5e62015-11-19 17:39:44 +08004 * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
lijuangc518f5d2015-02-10 10:22:53 +08005 *
Travis Geiselbrecht1d0df692008-09-01 02:26:09 -07006 * Permission is hereby granted, free of charge, to any person obtaining
7 * a copy of this software and associated documentation files
8 * (the "Software"), to deal in the Software without restriction,
9 * including without limitation the rights to use, copy, modify, merge,
10 * publish, distribute, sublicense, and/or sell copies of the Software,
11 * and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be
15 * included in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25#include <err.h>
26#include <debug.h>
27#include <target.h>
28#include <compiler.h>
Pavel Nedeva4c9d3a2013-05-15 14:42:34 +030029#include <dload_util.h>
Channagoud Kadabi41c81a62014-10-08 19:55:30 -070030#include <sdhci_msm.h>
Wufeng Jiang71246c22015-08-06 19:07:09 +080031#if PON_VIB_SUPPORT
Wufeng Jiang1ce072f2015-08-06 19:07:09 +080032#include <smem.h>
Wufeng Jiang71246c22015-08-06 19:07:09 +080033#include <vibrator.h>
34#include <board.h>
35#endif
Travis Geiselbrecht1d0df692008-09-01 02:26:09 -070036
lijuang3606df82015-09-02 21:14:43 +080037#include <smem.h>
38#include <pm8x41_adc.h>
39#include <pm8x41_hw.h>
lijuang395b5e62015-11-19 17:39:44 +080040#include <scm.h>
lijuang3606df82015-09-02 21:14:43 +080041
42#if CHECK_BAT_VOLTAGE
43#include <pm_fg_adc_usr.h>
44#endif
45
Subbaraman Narayanamurthyf17b4ae2011-02-16 20:19:56 -080046#define EXPAND(NAME) #NAME
47#define TARGET(NAME) EXPAND(NAME)
lijuang3606df82015-09-02 21:14:43 +080048
lijuang66192212015-09-22 10:25:48 +080049#define BATTERY_MIN_VOLTAGE 3200000 //uv
lijuang3606df82015-09-02 21:14:43 +080050#define PMIC_SLAVE_ID 0x20000
51#define BAT_IF_BAT_PRES_STATUS 0x1208
52
Amol Jadi57abe4c2011-05-24 15:47:27 -070053/*
Travis Geiselbrecht1d0df692008-09-01 02:26:09 -070054 * default implementations of these routines, if the target code
55 * chooses not to implement.
56 */
57
58__WEAK void target_early_init(void)
59{
60}
61
62__WEAK void target_init(void)
63{
64}
65
David Ng3679bc52010-02-09 15:43:43 -080066__WEAK void *target_get_scratch_address(void)
67{
68 return (void *)(SCRATCH_ADDR);
69}
70
Vivek Mehta5f1c9d42011-04-01 20:11:59 -070071__WEAK unsigned target_get_max_flash_size(void)
72{
73 return (120 * 1024 * 1024);
74}
75
Tanya Brokhman1c94f1a2015-02-15 09:05:03 +020076__WEAK int flash_ubi_img(void)
77{
78 return 0;
79}
80
Tanya Brokhman84eaaf62015-02-24 21:57:06 +020081__WEAK int update_ubi_vol(void)
82{
83 return 0;
84}
85
David Ng183a7422009-12-07 14:55:21 -080086__WEAK int target_is_emmc_boot(void)
87{
David Ng025c1d92009-12-09 23:46:00 -080088#if _EMMC_BOOT
89 return 1;
90#else
David Ng183a7422009-12-07 14:55:21 -080091 return 0;
David Ng025c1d92009-12-09 23:46:00 -080092#endif
David Ng183a7422009-12-07 14:55:21 -080093}
Chandan Uddarajude85d3f2010-01-05 16:32:33 -080094
95__WEAK unsigned check_reboot_mode(void)
96{
97 return 0;
98}
Chandan Uddaraju94183c02010-01-15 15:13:59 -080099
lijuangc518f5d2015-02-10 10:22:53 +0800100__WEAK unsigned check_hard_reboot_mode(void)
101{
102 return 0;
103}
104
Chandan Uddaraju94183c02010-01-15 15:13:59 -0800105__WEAK void reboot_device(unsigned reboot_reason)
106{
107}
Chandan Uddaraju7f5b9012010-02-06 16:37:48 -0800108
Matthew Qindefd5562014-07-11 18:02:40 +0800109__WEAK uint32_t is_user_force_reset(void)
110{
111 return 0;
112}
113
lijuang395b5e62015-11-19 17:39:44 +0800114__WEAK int set_download_mode(enum reboot_reason mode)
Pavel Nedev76a3e212013-05-09 10:37:21 +0300115{
lijuang395b5e62015-11-19 17:39:44 +0800116 if(mode == NORMAL_DLOAD || mode == EMERGENCY_DLOAD) {
117#if PLATFORM_USE_SCM_DLOAD
118 return scm_dload_mode(mode);
119#else
120 return -1;
121#endif
122 }
123
124 return 0;
Pavel Nedev76a3e212013-05-09 10:37:21 +0300125}
126
David Ngf773dde2010-07-26 19:55:08 -0700127__WEAK unsigned target_pause_for_battery_charge(void)
128{
129 return 0;
130}
Ajay Dudanid04110c2011-01-17 23:55:07 -0800131
132__WEAK unsigned target_baseband()
133{
134 return 0;
135}
Subbaraman Narayanamurthyf17b4ae2011-02-16 20:19:56 -0800136
137__WEAK void target_serialno(unsigned char *buf)
138{
Ajay Dudanif63d02f2011-10-01 08:29:53 -0700139 snprintf((char *) buf, 13, "%s",TARGET(BOARD));
Subbaraman Narayanamurthyf17b4ae2011-02-16 20:19:56 -0800140}
Amol Jadi57abe4c2011-05-24 15:47:27 -0700141
142__WEAK void target_fastboot_init()
143{
144}
Subbaraman Narayanamurthy0e445b02011-06-19 21:34:46 -0700145
146__WEAK int emmc_recovery_init(void)
147{
148 return 0;
149}
Shashank Mittalcd98d472011-08-02 14:29:24 -0700150
151__WEAK bool target_use_signed_kernel(void)
152{
153#if _SIGNED_KERNEL
154 return 1;
155#else
156 return 0;
157#endif
158}
Amol Jadi6834f1a2012-06-29 14:42:59 -0700159
Stanimir Varbanov8bc68c72013-07-08 18:22:04 +0300160__WEAK bool target_is_ssd_enabled(void)
161{
162#ifdef SSD_ENABLE
163 return 1;
164#else
165 return 0;
166#endif
167}
168
Stanimir Varbanov677001e2013-07-18 18:16:39 +0300169__WEAK void target_load_ssd_keystore(void)
170{
171}
Amol Jadi6834f1a2012-06-29 14:42:59 -0700172
173/* Default target does not support continuous splash screen feature. */
174__WEAK int target_cont_splash_screen()
175{
176 return 0;
177}
Amol Jadida118b92012-07-06 19:53:18 -0700178
179/* Default target specific initialization before using USB */
180__WEAK void target_usb_init(void)
181{
182}
183
184/* Default target specific usb shutdown */
185__WEAK void target_usb_stop(void)
186{
187}
Channagoud Kadabifa6179e2013-06-18 18:35:14 -0700188
189/* Default target specific target uninit */
190__WEAK void target_uninit(void)
191{
192}
Dhaval Patelcdcb6462013-07-18 14:46:57 -0700193
Padmanabhan Komandurubccbcdc2015-06-30 16:19:24 +0530194__WEAK bool target_display_panel_node(char *pbuf, uint16_t buf_size)
Dhaval Patelcdcb6462013-07-18 14:46:57 -0700195{
196 return false;
197}
Channagoud Kadabi9fbdcdf2013-09-19 16:24:16 -0700198
Aravind Venkateswaran6385f7e2014-02-25 16:45:11 -0800199__WEAK void target_display_init(const char *panel_name)
Aravind Venkateswarandd50c1a2014-02-25 14:42:43 -0800200{
201}
202
203__WEAK void target_display_shutdown(void)
204{
205}
206
Casey Piperf8cebb62013-09-11 15:56:17 -0700207__WEAK uint8_t target_panel_auto_detect_enabled()
208{
209 return 0;
210}
211
Casey Piper48bfc0d2013-11-18 13:24:35 -0800212__WEAK uint8_t target_is_edp()
213{
214 return 0;
215}
216
Amol Jadi417c7f22013-10-07 12:52:21 -0700217/* default usb controller to be used. */
218__WEAK const char * target_usb_controller()
219{
220 return "ci";
221}
Amol Jadi9ff7bb52013-10-11 14:11:45 -0700222
223/* override for target specific usb phy reset. */
224__WEAK void target_usb_phy_reset(void)
225{
226}
Hanumant Singh8e1ac232014-01-29 13:41:51 -0800227
228/* determine if target is in warm boot. */
229__WEAK bool target_warm_boot(void)
230{
231 return false;
232}
Aparna Mallavarapu373d38b2014-05-23 14:47:19 +0530233
234/* Determine the HLOS subtype of the target */
235__WEAK uint32_t target_get_hlos_subtype(void)
236{
237 return 0;
238}
Channagoud Kadabi82cf5c62014-08-24 22:17:34 -0700239
240/* Initialize crypto parameters */
241__WEAK void target_crypto_init_params()
242{
243}
Channagoud Kadabi41c81a62014-10-08 19:55:30 -0700244
Parth Dixit550ddf32016-11-28 17:00:29 +0530245__WEAK bool target_is_pmi_enabled(void)
246{
247 return 1;
248}
249
Channagoud Kadabi41c81a62014-10-08 19:55:30 -0700250/* Default CFG delay value */
251__WEAK uint32_t target_ddr_cfg_val()
252{
253 return DDR_CONFIG_VAL;
254}
Channagoud Kadabi2021cef2015-02-25 12:08:32 -0800255
Parth Dixitff1928a2016-11-16 19:57:21 +0530256/* Default CFG register value */
257uint32_t target_ddr_cfg_reg()
258{
259 uint32_t platform = board_platform_id();
260 uint32_t ret = SDCC_HC_REG_DDR_CONFIG;
261
262 switch(platform)
263 {
264 case MSM8937:
265 case MSM8940:
266 case APQ8037:
267 case MSM8917:
268 case MSM8920:
269 case MSM8217:
270 case MSM8617:
271 case APQ8017:
272 case MSM8953:
273 case APQ8053:
274 /* SDCC HC DDR CONFIG has shifted by 4 bytes for these platform */
275 ret += 4;
276 break;
277 default:
278 break;
279 }
280 return ret;
281}
282
Wufeng Jiang71246c22015-08-06 19:07:09 +0800283#if PON_VIB_SUPPORT
Parth Dixit7f683712015-12-23 15:59:16 +0530284void get_vibration_type(struct qpnp_hap *config)
Wufeng Jiang71246c22015-08-06 19:07:09 +0800285{
Wufeng Jiang71246c22015-08-06 19:07:09 +0800286 uint32_t hw_id = board_hardware_id();
287 uint32_t platform = board_platform_id();
Parth Dixit7f683712015-12-23 15:59:16 +0530288
289 config->vib_type = VIB_ERM_TYPE;
290 config->hap_rate_cfg1 = QPNP_HAP_RATE_CFG1_1c;
291 config->hap_rate_cfg2 = QPNP_HAP_RATE_CFG2_04;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800292 switch(hw_id){
293 case HW_PLATFORM_MTP:
294 switch(platform){
295 case MSM8952:
Parth Dixit7f683712015-12-23 15:59:16 +0530296 config->vib_type = VIB_ERM_TYPE;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800297 break;
298 case MSM8976:
vijay kumare9287242015-09-04 18:40:15 +0530299 case MSM8956:
300 case APQ8056:
Parth Dixit7f683712015-12-23 15:59:16 +0530301 config->vib_type = VIB_LRA_TYPE;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800302 break;
Parth Dixit7f683712015-12-23 15:59:16 +0530303 case MSM8937:
Parth Dixitd71e4172016-05-17 14:59:54 +0530304 case MSM8940:
Parth Dixit7f683712015-12-23 15:59:16 +0530305 case APQ8037:
Parth Dixit05f3c9f2016-03-18 17:14:57 +0530306 case MSM8917:
Mayank Groverb093c932016-10-03 18:04:13 +0530307 case MSM8920:
Parth Dixit05f3c9f2016-03-18 17:14:57 +0530308 case MSM8217:
309 case MSM8617:
310 case APQ8017:
Gaurav Nebhwani6c945a42016-02-16 17:26:51 +0530311 case MSM8953:
312 case APQ8053:
Parth Dixit7f683712015-12-23 15:59:16 +0530313 config->vib_type = VIB_LRA_TYPE;
314 config->hap_rate_cfg1 = QPNP_HAP_RATE_CFG1_41;
315 config->hap_rate_cfg2 = QPNP_HAP_RATE_CFG2_03;
Gaurav Nebhwani8e20d832016-02-12 15:07:58 +0530316 break;
vijay kumare9287242015-09-04 18:40:15 +0530317 default:
318 dprintf(CRITICAL,"Unsupported platform id\n");
319 break;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800320 }
321 break;
322 case HW_PLATFORM_QRD:
Parth Dixit7f683712015-12-23 15:59:16 +0530323 config->vib_type = VIB_ERM_TYPE;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800324 break;
vijay kumare9287242015-09-04 18:40:15 +0530325 default:
Parth Dixit7f683712015-12-23 15:59:16 +0530326 dprintf(CRITICAL,"Unsupported hardware id\n");
vijay kumare9287242015-09-04 18:40:15 +0530327 break;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800328 }
Wufeng Jiang71246c22015-08-06 19:07:09 +0800329}
330#endif
331
Channagoud Kadabi2021cef2015-02-25 12:08:32 -0800332/* Return Build variant */
333__WEAK bool target_build_variant_user()
334{
335#if USER_BUILD_VARIANT
336 return true;
337#else
338 return false;
339#endif
340}
lijuang3606df82015-09-02 21:14:43 +0800341
342__WEAK uint32_t target_get_pmic()
343{
344 return PMIC_IS_UNKNOWN;
345}
346
347/* Check battery if it's exist */
348bool target_battery_is_present()
349{
350 bool batt_is_exist;
351 uint8_t value = 0;
352 uint32_t pmic;
353
354 pmic = target_get_pmic();
355
356 switch(pmic)
357 {
358 case PMIC_IS_PM8909:
359 case PMIC_IS_PM8916:
360 case PMIC_IS_PM8941:
361 value = REG_READ(BAT_IF_BAT_PRES_STATUS);
362 break;
363 case PMIC_IS_PMI8950:
364 case PMIC_IS_PMI8994:
365 case PMIC_IS_PMI8996:
Parth Dixit550ddf32016-11-28 17:00:29 +0530366 if(target_is_pmi_enabled())
367 {
368 value = REG_READ(PMIC_SLAVE_ID|
369 BAT_IF_BAT_PRES_STATUS);
370 }
lijuang3606df82015-09-02 21:14:43 +0800371 break;
372 default:
373 dprintf(CRITICAL, "ERROR: Couldn't get the pmic type\n");
374 break;
375 }
376
377 batt_is_exist = value >> 7;
378
379 return batt_is_exist;
380
381}
382
383#if CHECK_BAT_VOLTAGE
384/* Return battery voltage */
385uint32_t target_get_battery_voltage()
386{
387 uint32_t pmic;
388 uint32_t vbat = 0;
389
390 pmic = target_get_pmic();
391
392 switch(pmic)
393 {
394 case PMIC_IS_PM8909:
395 case PMIC_IS_PM8916:
396 case PMIC_IS_PM8941:
397 vbat = pm8x41_get_batt_voltage(); //uv
398 break;
399 case PMIC_IS_PMI8950:
400 case PMIC_IS_PMI8994:
401 case PMIC_IS_PMI8996:
Parth Dixit550ddf32016-11-28 17:00:29 +0530402 if(target_is_pmi_enabled())
403 {
404 if (!pm_fg_usr_get_vbat(1, &vbat)) {
405 vbat = vbat*1000; //uv
406 } else {
407 dprintf(CRITICAL, "ERROR: Get battery voltage failed!!!\n");
408 }
lijuang3606df82015-09-02 21:14:43 +0800409 }
410 break;
411 default:
412 dprintf(CRITICAL, "ERROR: Couldn't get the pmic type\n");
413 break;
414 }
415
416 return vbat;
417}
418
419/* Add safeguards such as refusing to flash if minimum battery levels
420 * are not present or be bypass if the device doesn't have a battery
421 */
422bool target_battery_soc_ok()
423{
424 if (!target_battery_is_present()) {
425 dprintf(INFO, "battery is not present\n");
426 return true;
427 }
428
429 if (target_get_battery_voltage() >= BATTERY_MIN_VOLTAGE)
430 return true;
431
432 return false;
433}
434#endif