blob: 728402d6a1338684248d5e268ff2f73cc6e57db3 [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
245/* Default CFG delay value */
246__WEAK uint32_t target_ddr_cfg_val()
247{
248 return DDR_CONFIG_VAL;
249}
Channagoud Kadabi2021cef2015-02-25 12:08:32 -0800250
Wufeng Jiang71246c22015-08-06 19:07:09 +0800251#if PON_VIB_SUPPORT
Parth Dixit7f683712015-12-23 15:59:16 +0530252void get_vibration_type(struct qpnp_hap *config)
Wufeng Jiang71246c22015-08-06 19:07:09 +0800253{
Wufeng Jiang71246c22015-08-06 19:07:09 +0800254 uint32_t hw_id = board_hardware_id();
255 uint32_t platform = board_platform_id();
Parth Dixit7f683712015-12-23 15:59:16 +0530256
257 config->vib_type = VIB_ERM_TYPE;
258 config->hap_rate_cfg1 = QPNP_HAP_RATE_CFG1_1c;
259 config->hap_rate_cfg2 = QPNP_HAP_RATE_CFG2_04;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800260 switch(hw_id){
261 case HW_PLATFORM_MTP:
262 switch(platform){
263 case MSM8952:
Parth Dixit7f683712015-12-23 15:59:16 +0530264 config->vib_type = VIB_ERM_TYPE;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800265 break;
266 case MSM8976:
vijay kumare9287242015-09-04 18:40:15 +0530267 case MSM8956:
268 case APQ8056:
Parth Dixit7f683712015-12-23 15:59:16 +0530269 config->vib_type = VIB_LRA_TYPE;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800270 break;
Parth Dixit7f683712015-12-23 15:59:16 +0530271 case MSM8937:
272 case APQ8037:
Parth Dixit049a2d72016-01-29 14:42:43 +0530273 case MSMGOLD:
274 case MSMGOLD2:
275 case MSMGOLD3:
276 case APQGOLD:
Gaurav Nebhwani6c945a42016-02-16 17:26:51 +0530277 case MSM8953:
278 case APQ8053:
Parth Dixit7f683712015-12-23 15:59:16 +0530279 config->vib_type = VIB_LRA_TYPE;
280 config->hap_rate_cfg1 = QPNP_HAP_RATE_CFG1_41;
281 config->hap_rate_cfg2 = QPNP_HAP_RATE_CFG2_03;
Gaurav Nebhwani8e20d832016-02-12 15:07:58 +0530282 break;
vijay kumare9287242015-09-04 18:40:15 +0530283 default:
284 dprintf(CRITICAL,"Unsupported platform id\n");
285 break;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800286 }
287 break;
288 case HW_PLATFORM_QRD:
Parth Dixit7f683712015-12-23 15:59:16 +0530289 config->vib_type = VIB_ERM_TYPE;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800290 break;
vijay kumare9287242015-09-04 18:40:15 +0530291 default:
Parth Dixit7f683712015-12-23 15:59:16 +0530292 dprintf(CRITICAL,"Unsupported hardware id\n");
vijay kumare9287242015-09-04 18:40:15 +0530293 break;
Wufeng Jiang71246c22015-08-06 19:07:09 +0800294 }
Wufeng Jiang71246c22015-08-06 19:07:09 +0800295}
296#endif
297
Channagoud Kadabi2021cef2015-02-25 12:08:32 -0800298/* Return Build variant */
299__WEAK bool target_build_variant_user()
300{
301#if USER_BUILD_VARIANT
302 return true;
303#else
304 return false;
305#endif
306}
lijuang3606df82015-09-02 21:14:43 +0800307
308__WEAK uint32_t target_get_pmic()
309{
310 return PMIC_IS_UNKNOWN;
311}
312
313/* Check battery if it's exist */
314bool target_battery_is_present()
315{
316 bool batt_is_exist;
317 uint8_t value = 0;
318 uint32_t pmic;
319
320 pmic = target_get_pmic();
321
322 switch(pmic)
323 {
324 case PMIC_IS_PM8909:
325 case PMIC_IS_PM8916:
326 case PMIC_IS_PM8941:
327 value = REG_READ(BAT_IF_BAT_PRES_STATUS);
328 break;
329 case PMIC_IS_PMI8950:
330 case PMIC_IS_PMI8994:
331 case PMIC_IS_PMI8996:
332 value = REG_READ(PMIC_SLAVE_ID|
333 BAT_IF_BAT_PRES_STATUS);
334 break;
335 default:
336 dprintf(CRITICAL, "ERROR: Couldn't get the pmic type\n");
337 break;
338 }
339
340 batt_is_exist = value >> 7;
341
342 return batt_is_exist;
343
344}
345
346#if CHECK_BAT_VOLTAGE
347/* Return battery voltage */
348uint32_t target_get_battery_voltage()
349{
350 uint32_t pmic;
351 uint32_t vbat = 0;
352
353 pmic = target_get_pmic();
354
355 switch(pmic)
356 {
357 case PMIC_IS_PM8909:
358 case PMIC_IS_PM8916:
359 case PMIC_IS_PM8941:
360 vbat = pm8x41_get_batt_voltage(); //uv
361 break;
362 case PMIC_IS_PMI8950:
363 case PMIC_IS_PMI8994:
364 case PMIC_IS_PMI8996:
365 if (!pm_fg_usr_get_vbat(1, &vbat)) {
366 vbat = vbat*1000; //uv
367 } else {
368 dprintf(CRITICAL, "ERROR: Get battery voltage failed!!!\n");
369 }
370 break;
371 default:
372 dprintf(CRITICAL, "ERROR: Couldn't get the pmic type\n");
373 break;
374 }
375
376 return vbat;
377}
378
379/* Add safeguards such as refusing to flash if minimum battery levels
380 * are not present or be bypass if the device doesn't have a battery
381 */
382bool target_battery_soc_ok()
383{
384 if (!target_battery_is_present()) {
385 dprintf(INFO, "battery is not present\n");
386 return true;
387 }
388
389 if (target_get_battery_voltage() >= BATTERY_MIN_VOLTAGE)
390 return true;
391
392 return false;
393}
394#endif