# Copyright (c) 2012, 2014, 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
    swapon_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
    restorecon_recursive   /persist
    mkdir /persist/data 0700 system system
    mkdir /persist/data/sfs 0700 system system
    mkdir /persist/data/tz 0700 system system

    wait /dev/block/platform/msm_sdcc.1/by-name/modem
    mount vfat /dev/block/platform/msm_sdcc.1/by-name/modem /firmware ro context=u:object_r:firmware_file:s0,shortname=lower,uid=1000,gid=1000,dmask=227,fmask=337

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

on boot
    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
    # Enable writing to brightness node under torch-light from userspace
    chown system system /sys/class/leds/torch-light/brightness
    # Enable Focaltech touch controller auto firmware update
    write /sys/bus/i2c/drivers/ft5x06_ts/5-0038/update_fw 1

#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 --avg_comp
   class main
   user root
   disabled

service thermal-engine /system/bin/thermal-engine
   class main
   user root
   socket thermal-send-client stream 0666 system system
   socket thermal-recv-client stream 0660 system system
   socket thermal-recv-passive-client stream 0666 system system
   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
    socket ims_qmid stream 0660 system radio
    group radio net_raw log qcom_diag

service imsdatadaemon /system/bin/imsdatadaemon
    class main
    user system
    socket ims_datad stream 0660 system radio
    group system wifi radio inet 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
   socket ims_rtpd stream 0660 system radio
   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 main
   user system
   group system wifi radio
   oneshot

service ppd /system/bin/mm-pp-daemon
    class late_start
    disabled
    user system
    socket pps stream 0660 system system
    group system graphics

on property:init.svc.surfaceflinger=stopped
    stop ppd

on property:init.svc.surfaceflinger=running
    start ppd
