# Copyright (c) 2012, The Linux Foundation. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#     * Neither the name of The Linux Foundation nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#

on early-init
    mkdir /firmware 0771 system system
    symlink /data/tombstones /tombstones

on fs
    mount_all fstab.qcom

    # Keeping following partitions outside fstab file. As user may not have
    # these partition flashed on the device. Failure to mount any partition in fstab file
    # results in failure to launch late-start class.

    wait /dev/block/platform/msm_sdcc.1/by-name/cache
    mount ext4 /dev/block/platform/msm_sdcc.1/by-name/cache /cache nosuid nodev barrier=1

    wait /dev/block/platform/msm_sdcc.1/by-name/persist
    mount ext4 /dev/block/platform/msm_sdcc.1/by-name/persist /persist nosuid nodev barrier=1

    wait /dev/block/platform/msm_sdcc.1/by-name/modem
    mount vfat /dev/block/platform/msm_sdcc.1/by-name/modem /firmware ro shortname=lower,uid=1000,gid=1000,dmask=227,fmask=337
    write /sys/kernel/boot_adsp/boot 1

on post-fs-data
    mkdir /data/tombstones 0771 system system
    mkdir /tombstones/modem 0771 system system

# import cne init file
on post-fs
    export LD_PRELOAD /vendor/lib/libNimsWrap.so

on boot
    start imsqmidaemon
    insmod /system/lib/modules/adsprpc.ko
    # Enable writing to led blink node from userspace
    chown system system /sys/class/leds/red/blink
    chown system system /sys/class/leds/green/blink

#Start the qcom-system-daemon service
service qcomsysd /system/bin/qcom-system-daemon
    class main

#start camera server as daemon
service qcamerasvr /system/bin/mm-qcamera-daemon
    class late_start
    user camera
    group camera system inet input graphics

# Allow usb charging to be disabled persistently
on property:persist.usb.chgdisabled=1
   write /sys/class/power_supply/battery/charging_enabled 0

on property:persist.usb.chgdisabled=0
   write /sys/class/power_supply/battery/charging_enabled 1

service time_daemon /system/bin/time_daemon
   class late_start
   user root
   group root

service mpdecision /system/bin/mpdecision --no_sleep --avg_comp
   user root
   disabled

#start GNSS/Sensor interface daemon
service gsiff_daemon /system/bin/gsiff_daemon
   class late_start
   user system
   group gps net_raw

service thermal-engine /system/bin/thermal-engine
   class main
   user root
   group root

service qrngd /system/bin/qrngd -f
    class main
    user root
    group root


service qrngp /system/bin/qrngp
    class main
    user root
    group root
    oneshot
    disabled

on property:sys.boot_completed=1
    start qrngp

service qseecomd /system/bin/qseecomd
    class late_start
    user root
    group root

service audiod /system/bin/audiod
   class late_start
   user system
   group system

service adsprpcd /system/bin/adsprpcd
   class main
   user media
   group media

service imsqmidaemon /system/bin/imsqmidaemon
    class main
    user system
    group radio net_raw log qcom_diag
    disabled

# imsdatadaemon starts with root and UID will be downgraded to SYSTEM.
service imsdatadaemon /system/bin/imsdatadaemon
    class main
    user root
    group system wifi radio net_raw log qcom_diag net_admin
    disabled

on property:sys.ims.QMI_DAEMON_STATUS=1
    start imsdatadaemon

service ims_rtp_daemon /system/bin/ims_rtp_daemon
   class main
   user system
   group radio net_raw diag qcom_diag log
   disabled

on property:sys.ims.DATA_DAEMON_STATUS=1
    start ims_rtp_daemon

service wcnss-service /system/bin/wcnss_service
   class late_start
   user system
   group system wifi
   disabled
   oneshot

on property:wlan.driver.ath=0
    start wcnss-service

